我正在尝试使用PRAGMA foreign_key_check;,但没有成功:
我在数据库(使用PRAGMA foreign_keys = OFF;)上进行了一些外键冲突,然后我将其设置为true,然后启动了PRAGMA foreign_key_check;,但没有返回任何结果。
但是,当我尝试用PRAGMA foreign_keys = ON;插入与外键冲突的完全相同的行时,我确实得到了一个违反外键约束的错误。
我使用的是SQLite 3.7.3。
关于这个命令,我是不是遗漏了什么?有没有bug?
谢谢
编辑:我刚刚尝试了3.8.3.1 (这次是更高的版本;) ),但是没有得到任何结果:(
然而,其他一些命令似乎没有像预期的那样工作(特别是.schema !?):
SQLite version 3.8.3.1 2014-02-11 14:52:19
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> attach "D:\MusicLib_Minimal_TEST_FOREIGN_KEYS.db" as db1;
sqlite> .schema device
sqlite> PRAGMA foreign_keys=ON;
sqlite> PRAGMA foreign_keys;
1
sqlite> PRAGMA foreign_key_check;
sqlite> select * from device
...> ;
1|test|/|/|0|0
sqlite> select * from playlist
...> ;
sqlite> PRAGMA integrity_check;
ok
sqlite> .dump device
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
COMMIT;
sqlite> PRAGMA table_info(device);
0|idDevice|INTEGER|1||1
1|name|TEXT|1||0
2|source|TEXT|1||0
3|destination|TEXT|1||0
4|idPlaylist|INTEGER|1||0
5|idMachine|INTEGER|1||0
sqlite>发布于 2014-02-13 20:05:28
PRAGMA foreign_key_check是added in sqlite 3.7.16。你有an older version。
未知的编译指示只是no-ops;不会发出错误。
发布于 2014-02-13 22:08:50
我已经找到了解决方案:)问题是误用(还是bug ?)sqlite3.exe的
在不带参数的情况下调用sqlite3.exe时,会创建一个主要的空数据库,并且命令看起来不会应用附加的db:
D:\>sqlite3.exe
SQLite version 3.8.3.1 2014-02-11 14:52:19
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> attach "D:\MusicLib_Minimal_TEST_FOREIGN_KEYS.db" as db1
...> ;
sqlite> .databases
seq name file
--- --------------- ----------------------------------------------------------
0 main
2 db1 D:\MusicLib_Minimal_TEST_FOREIGN_KEYS.db
sqlite> .tables
db1.device db1.libType db1.optiontype db1.playlist
db1.file db1.machine db1.path db1.statement
db1.genre db1.option db1.playCounter db1.statsource
sqlite> .schema db1.device
sqlite> .exit如果将数据库作为sqlite3.exe的参数打开,则会按预期工作:
D:\>sqlite3.exe MusicLib_Minimal_TEST_FOREIGN_KEYS.db
SQLite version 3.8.3.1 2014-02-11 14:52:19
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .databases
seq name file
--- --------------- ----------------------------------------------------------
0 main D:\MusicLib_Minimal_TEST_FOREIGN_KEYS.db
sqlite> .tables
device genre machine optiontype playCounter statement
file libType option path playlist statsource
sqlite> .schema device
CREATE TABLE "device" (
"idDevice" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
"name" TEXT NOT NULL,
"source" TEXT NOT NULL,
"destination" TEXT NOT NULL,
"idPlaylist" INTEGER NOT NULL,
"idMachine" INTEGER NOT NULL,
FOREIGN KEY(idPlaylist) REFERENCES playlist(idPlaylist),
FOREIGN KEY(idMachine) REFERENCES machine(idMachine)
);
sqlite> PRAGMA foreign_keys;
0
sqlite> PRAGMA foreign_keys=ON;
sqlite> PRAGMA foreign_keys;
1
sqlite> PRAGMA foreign_key_check;
device|1|machine|0
device|1|playlist|1
sqlite> select * from device
...> ;
1|test|/|/|0|0
sqlite> select * from playlist
...> ;
sqlite> select * from machine
...> ;https://stackoverflow.com/questions/21753652
复制相似问题