Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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
Sql 创建表时在何处声明外键?_Sql_Database_Database Design_Foreign Keys - Fatal编程技术网

Sql 创建表时在何处声明外键?

Sql 创建表时在何处声明外键?,sql,database,database-design,foreign-keys,Sql,Database,Database Design,Foreign Keys,我想设计一个名为arguments的表,它的一个属性name链接到名为names的表中的另一个属性name 我看到了两种用SQL表示的方法: 通过在表上创建约束: 创建表名(名称文本唯一, 短文本唯一, 评论文本); 创建表参数(名称文本唯一, 评论文本, 外键(名称)引用名称(名称)); 通过动态限定属性: 创建表名(名称文本唯一, 短文本唯一, 评论文本); 创建表参数(名称文本唯一引用名称(名称), 评论文本); 我想知道: 如果通常认为两者中的一个优于另一个,以及 如果它能产生我应

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

我看到了两种用SQL表示的方法:

  • 通过在表上创建约束:

    创建表名(名称文本唯一,
    短文本唯一,
    评论文本);
    创建表参数(名称文本唯一,
    评论文本,
    外键(名称)引用名称(名称));
    
  • 通过动态限定属性:

    创建表名(名称文本唯一,
    短文本唯一,
    评论文本);
    创建表参数(名称文本唯一引用名称(名称),
    评论文本);
    
  • 我想知道:

    • 如果通常认为两者中的一个优于另一个,以及
    • 如果它能产生我应该意识到的后果

    谢谢您的帮助。

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


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

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

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


    不过,我要说的一点是,将ID作为唯一标识符和引用更为常见。这允许您更改名称字段中的值,而无需更改其标识和破坏引用完整性。有一些数据库可以级联此类更改并更新名称的所有引用,但通常认为更干净的做法是使用与数据分开的标识符。

    而第一个选项称为
    越行
    约束声明,第二个选项称为
    内行
    ,两者在功能上是相同的

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

    创建表

    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;
    
    启用约束

    ALTER TABLE arguments NOCHECK CONSTRAINT arguments_fk;
    
    ALTER TABLE arguments CHECK CONSTRAINT arguments_fk;
    

    这是针对SQL Server的。Oracle有相同的命令。

    您使用的是什么RDBMS?MySQL?SqlServer?等等?使用文本数据作为键是一种不好的做法。您的名称表应该有一个ID列,这将成为任何引用的FK。@cdeszaq我使用的是SQLite(用于概念证明)。如果这只是概念证明,那就没关系了。完成证明,然后进行实际工作。不要浪费时间解决目前不存在的问题。@cdeszaq-尽管“不要让事情阻止你去完成它”的观点有很大的优点,但我不会把它作为避免良好实践的理由(例如将标识符和数据作为单独的实体)。如果你开始将概念证明产品化,那么尽可能地做好这件事可以并且确实会让生活变得更加轻松。概念验证的一部分通常应该是软件架构。这两个都是外键关系的示例。