Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t使用外键创建sqlite表_Sql_Sqlite - Fatal编程技术网

Can';t使用外键创建sqlite表

Can';t使用外键创建sqlite表,sql,sqlite,Sql,Sqlite,我试图做一个简单的例子,使用外键通过sqlite链接两个表。然而,我不断地犯错误 我有两张桌子。成员,角色。一个成员可以有多个字符 以下是模式: 创建表“成员”( “成员id”文本不为空, “平台id”整数不为空, “索引”整数不为空主键自动递增唯一 ); 创建表格“字符”( “字符id”文本不为空, “索引”整数不为空主键自动递增唯一, “成员索引”整数不为空, 外键(成员索引) 参考成员(索引) 关于删除级联 ); 执行此操作时,会出现以下错误: Result: near "in

我试图做一个简单的例子,使用外键通过sqlite链接两个表。然而,我不断地犯错误

我有两张桌子。成员,角色。一个成员可以有多个字符

以下是模式:

创建表“成员”(
“成员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
  • 名称的更改意味着主键和外键具有相同的名称

如果您只使用纯SQLite,则必须访问此链接[