创建表时在哪里说出外键?

时间:2011-12-08 13:57:04

标签: sql database database-design foreign-keys

我想设计一个名为arguments的表,其中一个属性name链接到名为name的表中的另一个属性names

我在SQL中看到两种表达方式:

  1. 通过在表格上创建约束:

    CREATE TABLE names (   name text UNIQUE,
                          short text UNIQUE,
                        comment text);
    CREATE TABLE arguments (   name text UNIQUE,
                            comment text,
                            FOREIGN KEY (name) REFERENCES names (name));
    
  2. 通过即时识别属性:

    CREATE TABLE names (   name text UNIQUE,
                          short text UNIQUE,
                        comment text);
    CREATE TABLE arguments (   name text UNIQUE REFERENCES names (name),
                            comment text);
    
  3. 我想知道:

    • 如果两者中的一个通常比另一个更好,
    • 如果它可能产生我应该注意的后果。

    感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

对于相同的最终结果,这些只是不同的语法。

两者都是合适的,但前者在我的经历中是一种更常见的风格。这可能只是为了让人类的思想更容易消化所有信息。首先描述数据,然后描述它与世界其他地方的关系。

我要做的一个评论是,将ID作为唯一标识符和引用更为常见。这允许您更改“名称”字段中的“值”,而不更改其标识和中断参照完整性。有些数据库可以级联这些更改并更新所有出现的名称,但通常认为具有与数据分离的标识符更清晰。

答案 1 :(得分:1)

虽然第一个选项称为out-of-line约束声明,第二个选项为in-line,但它们在功能上都相同。

更好的是为外键约束指定名称。如果您有名称,则可以根据需要选择性地启用和禁用约束。

创建表

CREATE TABLE arguments 
(   
    name text UNIQUE,                         
    comment text,                         
    constraint arguments_fk FOREIGN KEY (name) REFERENCES names (name)
); 

禁用约束

ALTER TABLE arguments NOCHECK CONSTRAINT arguments_fk;

启用约束

ALTER TABLE arguments CHECK CONSTRAINT arguments_fk;

这适用于SQL Server。 Oracle有相同的命令。

答案 2 :(得分:0)

使用外键。如果您以后发现存在性能问题(可测量问题),那么您可以将其更改为不同。

首先要保持简单,尽快将产品送到用户手中。不要优化你无法证明需要的东西。