Can';t使用外键创建sqlite表
我试图做一个简单的例子,使用外键通过sqlite链接两个表。然而,我不断地犯错误 我有两张桌子。成员,角色。一个成员可以有多个字符 以下是模式:Can';t使用外键创建sqlite表,sql,sqlite,Sql,Sqlite,我试图做一个简单的例子,使用外键通过sqlite链接两个表。然而,我不断地犯错误 我有两张桌子。成员,角色。一个成员可以有多个字符 以下是模式: 创建表“成员”( “成员id”文本不为空, “平台id”整数不为空, “索引”整数不为空主键自动递增唯一 ); 创建表格“字符”( “字符id”文本不为空, “索引”整数不为空主键自动递增唯一, “成员索引”整数不为空, 外键(成员索引) 参考成员(索引) 关于删除级联 ); 执行此操作时,会出现以下错误: Result: near "in
创建表“成员”(
“成员id”文本不为空,
“平台id”整数不为空,
“索引”整数不为空主键自动递增唯一
);
创建表格“字符”(
“字符id”文本不为空,
“索引”整数不为空主键自动递增唯一,
“成员索引”整数不为空,
外键(成员索引)
参考成员(索引)
关于删除级联
);
执行此操作时,会出现以下错误:
Result: near "index": syntax error
At line 6:
CREATE TABLE "character" (
"character_id" TEXT NOT NULL,
"index" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
"member_index" INTEGER NOT NULL,
FOREIGN KEY (member_index)
REFERENCES member (index
如果我删除外键部分,那么它可以工作,但是当然,我没有外键
这似乎是一个简单的例子,但我无法让它发挥作用。对我缺少的内容有什么建议吗?
index
对于列名来说是个糟糕的选择。这是一个,因此需要在使用它的任何地方引用它-外键声明不:
CREATE TABLE "character" (
"character_id" TEXT NOT NULL,
"index" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
"member_index" INTEGER NOT NULL,
FOREIGN KEY (member_index)
REFERENCES member ("index") --> here
ON DELETE CASCADE
);
我强烈建议你选择一个不同的名字——这不会与关键词冲突——这样你就不需要永远记住不要忘记引号。英语中有很多单词,只有145个SQLite关键字。主键被简单地称为
index
:
CREATE TABLE "character" (
"character_id" TEXT NOT NULL,
"index" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
"member_index" INTEGER NOT NULL,
FOREIGN KEY (member_index)
REFERENCES member ("index");
然而,index
对于列来说是一个非常糟糕的名称,因为它是SQL关键字。作为一种习惯,我还将主键设置为表中的第一列。我将更改名称并建议:
CREATE TABLE members (
member_id INTEGER PRIMARY KEY AUTOINCREMENT,
member_name TEXT NOT NULL,
platform_id INTEGER NOT NULL
);
CREATE TABLE characters (
character_id INTEGER PRIMARY KEY AUTOINCREMENT,
character_name TEXT NOT NULL,
member_id INTEGER NOT NULL,
FOREIGN KEY (member_id) REFERENCES members(member_id) ON DELETE CASCADE
);
注意这些变化:
- 列名不能转义。这些是不需要的,双引号只是使代码混乱
- “id”都是数字。没有要求,但这是该术语的典型用法
- 以前的“id”现在称为“名称”
- 表格名称为复数形式。这是我使用的约定,因为表表示一组实体,而不仅仅是一个实体
- 与
主键一起使用时,
和非空
是多余的。不需要它们唯一
- SQLite要求为主键完全拼写出
INTEGER
- 名称的更改意味着主键和外键具有相同的名称