Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.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_Primary Key_Theory - Fatal编程技术网

SQL:应该在哪里定义主键

SQL:应该在哪里定义主键,sql,primary-key,theory,Sql,Primary Key,Theory,我正在用几个sql文件创建一个数据库 1文件创建表。 1文件添加了约束。 1文件删除约束 primary是一个约束,但是有人告诉我在表定义中定义主键,但没有给出原因 将主键定义为可以添加和删除的约束更好还是在表定义中更好 我目前的想法是在表定义中这样做,因为作为可移动约束这样做可能会导致重复键出现一些可怕的问题。 但是删除约束可能会导致严重的问题,因此如果有人删除主键,从可维护性的角度来看,他们应该采取适当的步骤来避免任何其他数据输入的问题。我想说的是,最好在表定义中包含主键,因为它是表最有可能

我正在用几个sql文件创建一个数据库 1文件创建表。 1文件添加了约束。 1文件删除约束

primary是一个约束,但是有人告诉我在表定义中定义主键,但没有给出原因

将主键定义为可以添加和删除的约束更好还是在表定义中更好

我目前的想法是在表定义中这样做,因为作为可移动约束这样做可能会导致重复键出现一些可怕的问题。
但是删除约束可能会导致严重的问题,因此如果有人删除主键,从可维护性的角度来看,他们应该采取适当的步骤来避免任何其他数据输入的问题。我想说的是,最好在表定义中包含主键,因为它是表最有可能用于什么的一个非常好的指示器


不过,其他约束也很重要,您的论点也成立。

从可维护性的角度来看,我认为最好在表定义中包含主键,因为它是表最有可能用于什么的一个非常好的指示器


不过,其他约束也很重要,您的论点也成立。

主键是约束,但约束不一定是主键。除了做一些重大的数据库手术,永远都不需要删除主键


将主键与表一起定义是一种很好的做法-如果将表和键定义分开,将打开一个窗口,使键定义丢失或被遗忘。考虑到任何像样的数据库设计都完全依赖于一致的键,您永远都不希望主键有丝毫不正常的机会。

主键是一个约束,但约束不一定是主键。除了做一些重大的数据库手术,永远都不需要删除主键


将主键与表一起定义是一种很好的做法-如果将表和键定义分开,将打开一个窗口,使键定义丢失或被遗忘。考虑到任何像样的数据库设计都完全依赖于一致的键,您永远都不希望主键有一点点不正常运行的机会。

所有这些都是特定于平台的,但主键是一个逻辑概念,而约束(或唯一索引,或其他)是实现“主键”逻辑概念的物理对象。
这是将其与表本身(它是逻辑主文件)而不是约束文件放在一起的另一个理由

所有这些都是特定于平台的,但主键是一个逻辑概念,而约束(或唯一索引,或其他)是实现“主键”逻辑概念的物理对象。
这是将其与表本身(它是逻辑主文件)而不是约束文件放在一起的另一个理由

对于有效的源代码管理,为每个对象(包括约束)提供单独的脚本通常是有意义的。这样,您可以单独跟踪每个对象的更改。

对于有效的源代码管理,为每个对象使用单独的脚本(包括约束)通常是有意义的。通过这种方式,您可以单独跟踪每个对象的更改。

将与表相关的所有内容都保存在一个文件中有一定的逻辑意义——列定义、键、索引、触发器等。如果您不必从SQL重建非常大的数据库,那么几乎可以一直正常工作。有几次它工作不好,可能不值得更改将所有相关内容保存在一个文件中的过程

但是,如果您必须重建一个非常大的数据库,或者如果您需要将一个数据库移动到另一台服务器上进行测试,或者如果您只是想摆弄一些东西,那么将它们拆分是有意义的。在PostgreSQL中,我们像这样分解事物。所有这些文件都受版本控制

  • 在一个文件中创建所有域语句
  • 每个CREATETABLE语句都位于单独的文件中。该文件包括除外键约束以外的所有约束,这些约束表示为ALTER TABLE语句。(稍后将对此进行详细介绍。)
  • 每个表的外键约束位于单独的文件中
  • 每个表的非键列索引位于单独的文件中
  • 每个表的触发器位于单独的文件中。(如果一个表有三个触发器,则所有三个触发器都放在一个文件中。)
  • 每个表的数据都在一个单独的文件中。(仅适用于数据库联机前加载的表。)
  • 每个表的规则都在一个单独的文件中
  • 每个函数都在一个单独的文件中。(函数相当于PostgreSQL的存储过程。)
没有外键约束,我们可以按任意顺序加载表。加载表之后,我们可以运行一个脚本来重建所有外键。makefile负责将正确的单个文件捆绑在一起。(由于它们是独立的文件,如果需要,我们可以单独运行它们。)

如果表没有约束,则加载速度更快。我说过我们把每个CREATETABLE语句放在一个单独的文件中。该文件包括除外键约束以外的所有约束,这些约束表示为ALTER TABLE语句。您可以使用流式编辑器
sed
将这些文件分成两部分。一件具有列定义;另一部分包含所有“altertableaddconstraint”语句。makefile负责拆分源文件并将它们捆绑在一起——一个SQL文件中的所有表定义,另一个SQL文件中的所有ALTER table语句。然后我们可以运行一个脚本来创建所有的表