sqlite - 如果在SQLite中使用外键,则创建表失败

标签 sqlite

我真的不知道为什么这个PHP代码没有创建三个表。第一个和第二个很好。但是第三个失败了。第三个与第二个非常相似,但是在外键定义之后还有另一个字段。我在这里做错了什么?

$db = new \PDO("sqlite:d:/temp/test_db.sqlite");
$db->exec("PRAGMA foreign_keys = 'ON'");


$statement = $db->query("CREATE TABLE  IF NOT EXISTS customers(
  id TEXT PRIMARY KEY NOT NULL , 
  name TEXT  
)");

$statement->execute();

$statement = $db->query("CREATE TABLE  IF NOT EXISTS appointments (
  id TEXT PRIMARY KEY NOT NULL , 
  customer TEXT   , 
  FOREIGN KEY (customer) REFERENCES customers(id)  
)");

$statement->execute();


$statement = $db->query("CREATE TABLE  IF NOT EXISTS appointment (
  id TEXT PRIMARY KEY NOT NULL ,  
  customer TEXT   , 
  FOREIGN KEY (customer) REFERENCES customers(id),
  nextfield TEXT
)");

$statement->execute();

最佳答案

根据SQLite grammar规范,nextfield TEXT应该与其他列定义一起放置。 FOREIGN KEYtable-constraint部分相关,应在列定义之后定义:

$statement = $db->query("CREATE TABLE  IF NOT EXISTS appointment (
  id TEXT PRIMARY KEY NOT NULL ,  
  customer TEXT   , 
  nextfield TEXT,
  FOREIGN KEY (customer) REFERENCES customers(id)
)");

关于sqlite - 如果在SQLite中使用外键,则创建表失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48019564/

相关文章:

c# - SQlite using 语句在另一台计算机上给出无法加载 DLL 'SQLite.Interop.dll' 错误

iphone - FMDatabase:执行操作:插入,更新,选择,删除

java - 如何使用API​​而不是硬编码字符串进行sqlite upsert?

regex - 按正则表达式分组

c++ - 桌面应用程序数据库

sql - 三重加入sqlite

nhibernate - 为什么 HQL 中的 NHibernate 简单选择到 SQLite 数据库不起作用?

mysql - 使用迁移文件将 MySQL-DB-Dump 导入 Rails 应用程序

sqlite 选择特定月份的特定日期和非特定月份

python - sqlite3中整数主键没有自动增量