Mysql 为什么Django在使用外键时添加约束,而不是在Create语句中定义它?
我正在学习Django教程并定义投票和选择模型。当我运行Mysql 为什么Django在使用外键时添加约束,而不是在Create语句中定义它?,mysql,sql,django,Mysql,Sql,Django,我正在学习Django教程并定义投票和选择模型。当我运行manage.py sql polls查看sql语句时,我得到: CREATE TABLE `polls_poll` ( `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `question` varchar(200) NOT NULL, `pub_date` datetime NOT NULL ); CREATE TABLE `polls_choice` (
manage.py sql polls
查看sql语句时,我得到:
CREATE TABLE `polls_poll` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`question` varchar(200) NOT NULL,
`pub_date` datetime NOT NULL
);
CREATE TABLE `polls_choice` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`poll_id` integer NOT NULL,
`choice_text` varchar(200) NOT NULL,
`votes` integer NOT NULL
);
ALTER TABLE `polls_choice` ADD CONSTRAINT `poll_id_refs_id_3aa09835`
FOREIGN KEY (`poll_id`) REFERENCES `polls_poll` (`id`);
为什么Django在应用外键时使用ALTER
语句,而不是在Create table
语句中使用它?类似以下内容似乎更为简洁:
`poll_id integer NOT NULL REFERENCES polls_choice(id)`
避免依赖性问题和循环引用。例如,想象两个表:
CREATE TABLE parent ( id, first_child_id );
CREATE TABLE child ( id, parent_id );
定义表后,必须至少添加父级和子级之间的一个引用
现在,因为MySQL在引用完整性方面并不特别小心,所以这不是一个问题:
mysql> CREATE TABLE parent ( id INTEGER PRIMARY KEY, first_child_id INTEGER NOT NULL REFERENCES child(id) );
Query OK, 0 rows affected (0.00 sec)
但更迂腐的数据库引擎会抱怨:
test=# BEGIN;
BEGIN
test=# SET CONSTRAINTS ALL DEFERRED;
SET CONSTRAINTS
test=# CREATE TABLE parent (id INTEGER PRIMARY KEY, first_child_id INTEGER NOT NULL REFERENCES child(id));
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "parent_pkey" for table "parent"
ERROR: relation "child" does not exist
谢谢你富有洞察力的回答!这很有道理。