约束主键和普通主键有什么区别?

时间:2017-04-28 09:00:11

标签: sql sql-server tsql

我知道可以使用约束来放置多个这样的字段:

CREATE TABLE Persons (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int,
CONSTRAINT PK_Person PRIMARY KEY (ID,LastName)
);

但如果我们不得不比较下面这两个,那有什么不同吗?

Create table client 
(cod_clt int identity not null,
Nom t,
Dn datetime not null,
Credit numeric(6,2) not null,
Constraint x1 check (credit between 100 and 1456.25),
Constraint x2 primary key (cod_clt)
)

和此:

   Create table client 
(cod_clt int primary key,
Nom t,
Dn datetime not null,
Credit numeric(6,2) not null,
Constraint x1 check (credit between 100 and 1456.25)
) 

1 个答案:

答案 0 :(得分:0)

SQL Server中有6个约束:

  1. NOT NULL
  2. 唯一钥匙
  3. 主键
  4. Foriegn Key
  5. 检查
  6. 默认
  7. (有些人,包括我自己,会争辩说,列数据类型和唯一索引也是约束的类型,但我离题了。)

    在SQL Server中有两个类型约束:列级别和表级别。

    NOT NULL是列级约束,其他所有都可以是表级或列级。主键和外键可以包含一个或多个列;当它们由多个列组成时,它们被称为“复合键”。复合键必须是表级。

    列和表级约束之间最显着的区别是表级允许您为约束赋予有意义的名称,这就是我个人更喜欢它们的原因。

    在第一个示例中,您有一个表级主键约束,它是一个复合键。在最后两个示例中没有复合键,这就是它可以是表级和列级的原因。最后两个示例的主要区别在于,您可以命名表级主键,但不能命名列级别。对于正确管理元数据的人来说,这是一个大问题。

    最后,有一点让Primary Key&唯一约束是特殊的,因为在创建它们时,您可以创建索引。主键的默认行为是还创建聚簇索引。创建聚簇索引和/或唯一索引的决定是一个很大的决定因此,当我定义主(和唯一)键时,我将包含关键字或非聚簇关键字,以便不依赖于此的默认系统行为。

    这里有一些关于约束的好链接:

    https://technet.microsoft.com/en-us/library/ms189862(v=sql.105).aspx - (微软) https://www.w3schools.com/sql/sql_constraints.asp(W3学校)