首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PRAGMA foreign_key_check;

PRAGMA foreign_key_check;
EN

Stack Overflow用户
提问于 2014-02-13 19:59:44
回答 2查看 3.9K关注 0票数 2

我正在尝试使用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 !?):

代码语言:javascript
复制
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>
EN

回答 2

Stack Overflow用户

发布于 2014-02-13 20:05:28

PRAGMA foreign_key_checkadded in sqlite 3.7.16。你有an older version

未知的编译指示只是no-ops;不会发出错误。

票数 5
EN

Stack Overflow用户

发布于 2014-02-13 22:08:50

我已经找到了解决方案:)问题是误用(还是bug ?)sqlite3.exe的

在不带参数的情况下调用sqlite3.exe时,会创建一个主要的空数据库,并且命令看起来不会应用附加的db:

代码语言:javascript
复制
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的参数打开,则会按预期工作:

代码语言:javascript
复制
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
   ...> ;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21753652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档