Sqlite 向数据库添加值但外键约束失败
我是sqlite3新手,对外键不太了解。我正在尝试向用户插入数据: 插入Sqlite 向数据库添加值但外键约束失败,sqlite,Sqlite,我是sqlite3新手,对外键不太了解。我正在尝试向用户插入数据: 插入用户(用户id,名称)值(201503426,'John Doe') 但在我运行它之后,我收到了外键约束失败消息 所以我有三张桌子: CREATE TABLE `User` ( `User_id` integer, `plate_number` integer DEFAULT 0, `name` text DEFAULT 'user', `spot_number` integer DEFAULT 0, `cred
用户
(用户id
,名称
)值(201503426,'John Doe')
但在我运行它之后,我收到了外键约束失败
消息
所以我有三张桌子:
CREATE TABLE `User` (
`User_id` integer,
`plate_number` integer DEFAULT 0,
`name` text DEFAULT 'user',
`spot_number` integer DEFAULT 0,
`credit` integer DEFAULT 0,
`order_id` integer DEFAULT 0,
FOREIGN KEY(`order_id`) REFERENCES `Orderr`(`order_id`),
FOREIGN KEY(`spot_number`) REFERENCES `Spot`(`spot_id`),
PRIMARY KEY(`User_id`)
);
CREATE TABLE `Spot` (
`spot_id` integer,
`user_id` text DEFAULT 'vacant',
`order_id` integer DEFAULT 0,
`status` integer DEFAULT 0,
FOREIGN KEY(`order_id`) REFERENCES `Orderr`(`order_id`),
FOREIGN KEY(`user_id`) REFERENCES `User`(`User_id`),
PRIMARY KEY(`spot_id`)
);
CREATE TABLE `Orderr` (
`order_id` integer,
`user_id` text DEFAULT 'user',
`spot_number` integer DEFAULT 0,
`amount_due` integer DEFAULT 0,
`time_lapse` integer DEFAULT 0,
PRIMARY KEY(`order_id`),
FOREIGN KEY(`user_id`) REFERENCES `User`(`User_id`),
FOREIGN KEY(`spot_number`) REFERENCES `Spot`(`spot_id`)
);
如何添加值而不出错?以下是
用户表的创建表语句:
CREATE TABLE User (
User_id integer,
plate_number integer DEFAULT 0,
name text DEFAULT 'user',
spot_number integer DEFAULT 0,
credit integer DEFAULT 0,
order_id integer DEFAULT 0,
FOREIGN KEY(order_id) REFERENCES Orderr(order_id),
FOREIGN KEY(spot_number) REFERENCES Spot(spot_id),
PRIMARY KEY(User_id)
);
重要的是,对于除User\u id
之外的所有列,都定义了默认的非NULL
值。现在考虑你的插入语句:
INSERT INTO User (User_id, name)
VALUES
(201503426, 'John Doe');
由于未指定order\u id
列(以及其他几个列),因此将插入默认值。因此,插入将导致添加以下记录:
(User_id, plate_number, name, spot_number, credit, order_id)
(201503426, 0, 'John Doe', 0, 0, 0)
现在,由于在order\u id
和spot\u number
上有外键约束,SQLite将进行检查,以确保这些对应的表实际上具有与插入的记录相对应的实体。我的猜测是这样的记录不存在,这就是为什么你会看到这个错误
有几种方法可以解决这个问题,但我建议的直接改变是不要对外键列使用默认值。相反,允许它们为NULL
。通过这种方式,您可以执行当前的插入操作,但最终会得到以下记录:
(User_id, plate_number, name, spot_number, credit, order_id)
(201503426, NULL, 'John Doe', NULL, NULL, NULL)
SQLite将允许外键列具有NULL
值,并且不指向其父表。这将允许您稍后填写空白,可能是在您有可用信息时。类似于:,和