在SQL中创建约束的不同方法的优缺点是什么?

时间:2014-06-16 09:26:52

标签: sql sql-server database

虽然它可能看起来像基于意见的主要问题,但事实并非如此。

我想知道在SQL中创建约束的每种可能约定的优缺点是什么。由于我使用的是SQL Server,因此我将展示三个创建主键约束的示例,我很喜欢这些约束:

  1. CREATE TABLE Persons (Id int NOT NULL PRIMARY KEY);
    • +:简洁
    • - :生成半随机名称
    • - :不能覆盖多列
  2. CREATE TABLE Persons (Id int NOT NULL, CONSTRAINT PK_Persons_Id PRIMARY KEY(Id));
    • +:midding简明
    • +:可以涵盖多列
    • +:开发者事先知道什么是主键,什么是pk的名字
    • - :减少创建语句可重用性
  3. CREATE TABLE Persons (Id int NOT NULL); ALTER TABLE Persons ADD CONSTRAINT PK_Persons_Id PRIMARY KEY (Id);
    • +:将表创建语句与其约束分开,这可能会增加一些好处,如代码可重用性
    • - :它可能会模糊表格架构,因为开发人员事先并不知道什么是主键
  4. 这是我迄今为止发现的利弊。也许更有经验的开发人员可以指出其他因素,这些因素有助于在开发和生产环境中创建主键和其他约束时做出最佳决策。 E.g:

    • 开发人员事先并不知道将来会使用什么工具。也许有一些常用的工具不支持某种语法。
    • 如果我们可以在不同的数据库上使用它,代码可以重复使用。这可能是使用一种语法而不是其他语法的论据。
    • 也许有人遇到过某种情况,他想要在没有约束的情况下创建表格创建语句以及出于什么原因。

    我相信我们可以分享我们关于何时一种语法比其他语法具有实际好处的知识。

1 个答案:

答案 0 :(得分:3)

从操作的角度来看:为每个约束赋予其自己的唯一名称,以便稍后通过其名称引用它来更改或删除约束。

此外,我更喜欢和普通索引加上对唯一索引的命名唯一约束,因此我可以在以后删除索引而不会丢失索引,当DBMS支持时。实际上我只在Oracle上看过这个:你可以用普通(非唯一)索引支持一个唯一约束。删除约束时,索引保持不变。这对于稳定的执行计划非常重要("计划稳定性")。不幸的是,看起来SQL Server和PostgreSQL在当前版本中都不支持此功能。

使用单独命名的约束,它也更容易区分数据库模式:您只需枚举按名称排序到平面文件中的所有表名,列名,索引名和约束名。然后,您可以轻松地将其与参考文件进行比较,并查找意外差异。当你没有稳定的名字并且必须比较约束的语义时,这就困难得多。