如何解决SQLite3相同的.read文件在一个会话中有效,但在下一个会话中无效
我已经在从sqlite3终端运行的文件中准备了一个庞大的sql语句列表(INSERT调用)
.read tmp/commands.sql
当我在会话#1中一次或多次运行命令时,一切正常,没有错误,并且没有出现预期的结果,忽略将防止重复出现错误消息。
现在,如果我用.quit
退出sqlite3,则立即返回并运行相同的命令.read tmp/commands.sql
,对于我的commands.sql中的每个sql调用,我都会收到一条错误消息"Error: near line xxx: FOREIGN KEY constraint failed"
- 我的数据库由两个具有关联关系的表组成
- 在第二个表中定义了一个外键,以通过其唯一ID(FolderID)链接到第一个拳头。
- 在sql脚本的开头,我以允许关系的形式添加了
PRAGMA foreign_keys = true;
您能解释一下为什么在第二届会议上会发生这种情况吗?
谢谢
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,ActionDate,ActionName,Comment
)
VALUES (
last_insert_rowid(),"AddIlluminaFolders2",""
);
-- ----------------------------------------------------------------
之后是许多其他同类块,直到文件结尾为PRAGMA foreign_keys = true;
这是我的完整表格定义
/*
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,"DBAddDate" TEXT(255,"FolderPath" TEXT(255,0) NOT NULL,"FolderName" TEXT(255,"FolderSize" INTEGER(20,"Protection" INTEGER(1,"DeviceModel" TEXT(255,"StartDate" TEXT(255,"DeviceID" TEXT(255,"RunNr" TEXT(255,"FlowCellID" TEXT(255,"ProjectNR" TEXT(255,"Status" TEXT(255,"DeliveryDate" TEXT(255,"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,"ActionDate" TEXT,"ActionName" TEXT(255,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()
将插入最后一行的值。这将永远不会给外键失败。调用新会话时,不会插入任何行(由于“重复”),last_insert_rowid()
的值为0,因此在插入Actions时违反FOREIGN KEY。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。