【问题标题】:Why does Django add constraint when using Foreign Key instead of defining it in Create statement?为什么Django在使用外键时添加约束而不是在Create语句中定义它?
【发布时间】:2013-04-01 12:20:36
【问题描述】:

我正在阅读 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` (
    `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)`

【问题讨论】:

    标签: mysql sql django


    【解决方案1】:

    为了避免依赖问题和循环引用。例如,假设有两个表:

    CREATE TABLE parent ( id, first_child_id );
    CREATE TABLE child ( id, parent_id );
    

    在定义表后,必须添加parentchild 之间的至少一个引用。

    现在,因为 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
    

    【讨论】:

    • 感谢您富有洞察力的回答!很有道理。
    猜你喜欢
    • 2013-01-08
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 2021-12-08
    • 2011-04-22
    • 1970-01-01
    • 2018-05-10
    • 2021-02-19
    相关资源
    最近更新 更多