SQLite3 相同的 .read 文件在一个会话中有效,但在下一个会话中无效

SQLite3 same .read file works in one session but not in next

我在一个文件中准备了一大堆 sql 语句(INSERT 调用),我从 sqlite3 终端 运行 使用

.read tmp/commands.sql

当我在会话 #1 中 运行 命令一次或多次时,一切顺利,没有错误,结果如预期的那样,忽略可防止重复的错误消息)。

现在如果我用 .quit 退出 sqlite3 然后立即回来 运行 相同的命令 .read tmp/commands.sql 我得到每个 sql 调用我的 commands.sql 一条错误消息 "Error: near line xxx: FOREIGN KEY constraint failed"

你能解释一下为什么在第二个会话中会发生这种情况吗?

谢谢


commands.sql 文件中的第一个调用如下所示

PRAGMA foreign_keys = true;


/*
------------------------------------------------------------------
adding data in Folders for '0003_Runs/HiSeq2500/190921_7001450_0495_AH5JJ7BCX3
------------------------------------------------------------------
*/

INSERT OR IGNORE INTO Folders 
  (
  Creator, 
  CreatorVersion, 
  DBAddDate, 
  FolderPath, 
  FolderName, 
  FolderSize, 
  Protection, 
  DeviceModel, 
  StartDate, 
  DeviceID, 
  RunNr, 
  FlowCellID, 
  ProjectNR, 
  Status, 
  DeliveryDate, 
  Comment
  )
VALUES (
  "AddIlluminaFolders2", 
  " 1.0; 2020-09-11", 
  "1600864879", 
  "0003_Runs/HiSeq2500", 
  "190921_7001450_0495_AH5JJ7BCX3", 
  "183173644288", 
  "0", 
  "HiSeq2500", 
  "190921", 
  "7001450", 
  "0495", 
  "AH5JJ7BCX3", 
  "", 
  "done", 
  "", 
  ""
  );

/*
------------------------------------------------------------------
adding data in Actions for 0003_Runs/HiSeq2500/190921_7001450_0495_AH5JJ7BCX3
------------------------------------------------------------------
*/

INSERT OR IGNORE INTO Actions 
  (
  FolderID,
  Creator, 
  CreatorVersion, 
  ActionDate, 
  ActionName, 
  Comment
  )
VALUES (
  last_insert_rowid(),
  "AddIlluminaFolders2", 
  " 1.0; 2020-09-11", 
  "1600864879", 
  "AddIlluminaFolders2", 
  ""
  );

-- ----------------------------------------------------------------

之后是许多其他同类块,直到文件结尾 PRAGMA foreign_keys = true;

这是我的完整 table 定义

/*
 Database structure for NCDataMngr and BigData_viewer
 Author: Stéphane Plaisance - VIB-Nucleomics Core
 database version: 1.0 - 2020-09-11
 File Encoding         : utf-8
 REM: edit below if you change the database schema
 => INSERT INTO "version" (vnum, vdate) VALUES ("1.0", "2020-09-11");
*/

PRAGMA foreign_keys = false;

-- ----------------------------
--  Table structure for Folders
-- ----------------------------
DROP TABLE IF EXISTS "Folders";
CREATE TABLE "Folders" (
     "FolderID" INTEGER NOT NULL PRIMARY KEY,
     "Creator" TEXT(255,0),
     "CreatorVersion" TEXT(255,0),
     "DBAddDate" TEXT(255,0),
     "FolderPath" TEXT(255,0) NOT NULL,
     "FolderName" TEXT(255,0) NOT NULL,
     "FolderSize" INTEGER(20,0),
     "Protection" INTEGER(1,0),
     "DeviceModel" TEXT(255,0),
     "StartDate" TEXT(255,0),
     "DeviceID" TEXT(255,0),
     "RunNr" TEXT(255,0),
     "FlowCellID" TEXT(255,0),
     "ProjectNR" TEXT(255,0),
     "Status" TEXT(255,0),
     "DeliveryDate" TEXT(255,0),
     "Comment" TEXT(255,0)
);
INSERT INTO "main".sqlite_sequence (name, seq) VALUES ("Folders", '0');

-- ----------------------------
--  Table structure for Actions
-- ----------------------------
DROP TABLE IF EXISTS "Actions";
CREATE TABLE "Actions" (
     "FolderID" INTEGER NOT NULL,
     "ActionID" INTEGER NOT NULL PRIMARY KEY,
     "Creator" TEXT(255,0),
     "CreatorVersion" TEXT(255,0),
     "ActionDate" TEXT,
     "ActionName" TEXT(255,0),
     "Comment" TEXT(255,0),
    CONSTRAINT "Folders2Actions" FOREIGN KEY ("FolderID") REFERENCES "Folders" ("FolderID") ON DELETE CASCADE ON UPDATE CASCADE
);
INSERT INTO "main".sqlite_sequence (name, seq) VALUES ("Actions", '0');

-- ----------------------------
--  Table structure for version
-- ----------------------------
DROP TABLE IF EXISTS "version";
CREATE TABLE "version" (
     "vnum" text,
     "vdate" text
);
INSERT INTO "main".sqlite_sequence (name, seq) VALUES ("version", '0');
INSERT INTO "version" (vnum, vdate) VALUES ("1.1", "2020-09-23");

-- ----------------------------
--  View structure for ActionView
-- ----------------------------
DROP VIEW IF EXISTS "ActionView";
CREATE VIEW "ActionView" AS SELECT
Actions.*,
Folders.FolderName
FROM
Actions
INNER JOIN Folders ON Folders.FolderID = Actions.FolderID
ORDER BY
Actions.FolderID ASC,
Actions.ActionID ASC;

-- ----------------------------
--  View structure for FolderView
-- ----------------------------
DROP VIEW IF EXISTS "FolderView";
CREATE VIEW "FolderView" AS SELECT
Folders.*
FROM
Folders
ORDER BY
Folders.FolderID ASC;

-- ----------------------------
--  Indexes structure for table Folders
-- ----------------------------
CREATE UNIQUE INDEX "idx_Folders_FolderPath_FolderName" on Folders ( "FolderPath", "FolderName" );

-- ----------------------------
--  Indexes structure for table Actions
-- ----------------------------
CREATE INDEX "idx_Actions_FolderID" ON Actions ("FolderID" ASC);
CREATE UNIQUE INDEX "idx_Actions_FolderID_Creator" ON Actions ("FolderID" ASC, "Creator");

PRAGMA foreign_keys = true;

last_insert_rowid()。当 commands.sql 在同一会话中 运行 多次时, last_insert_rowid() 具有插入的最后一行的值。这永远不会导致 FOREIGN KEY 失败。调用新会话时,不会插入任何行(因为“dupes”),last_insert_rowid() 的值为 0,因此操作插入时违反了 FOREIGN KEY。