创建表时使用CONSTRAINT关键字

时间:2019-05-10 03:48:56

标签: sql sql-server

关于在创建新表时使用CONSTRAINT关键字的问题。我在下面看到了一些这样的代码:

CREATE TABLE dbo.T1
(
    keycol INT NOT NULL IDENTITY(1, 1) 
        CONSTRAINT PK_T1 PRIMARY KEY,
    datacol NVARCHAR(40) NOT NULL
);

我的问题是,NOT NULL是否也和CONSTRAINT一样PRIMARY KEY,所以为什么要为CONSTRAINT放置PRIMARY KEY关键字,但是不适合NOT NULL吗?

2 个答案:

答案 0 :(得分:2)

CREATE TABLE

中所述
  

CONSTRAINT是一个可选关键字,指示开始   PRIMARY KEY,NOT NULL,UNIQUE,FOREIGN KEY或CHECK的定义   约束。

因此,您可以根据需要在其中使用CONSTRAINT关键字

CREATE TABLE dbo.T1
(
    keycol INT NOT NULL IDENTITY(1, 1) 
        CONSTRAINT PK_T1 PRIMARY KEY,
    datacol NVARCHAR(40) CONSTRAINT Foo NOT NULL
);

这是没有意义的,因为只有在指定名称时约束才需要使用约束关键字。并且,当与NOT NULL一起使用时,实际上并没有在sys.constraints中创建约束对象,因此该名称不会存储在任何地方。它是否可为空只是该列的一个属性。

答案 1 :(得分:1)

可以使用ALTER TABLE ALTER COLUMN语句修改NOT NULL约束。因此,NOT NULL约束的显式名称是没有用的。 NOT NULL约束的名称将不会存储在数据库的元数据中。

可以使用ALTER TABLE DROP CONSTRAINT语句删除其他约束(主键,外键,唯一,检查和默认)。对于此类语句,必须指定约束名称。因此从技术上讲,此类约束始终需要一个约束名称。

但是约束名称在SQL语法中始终是可选的,因此在创建约束时始终可以省略CONSTRAINT [constraintname]。所以这也是有效的SQL:

CREATE TABLE dbo.T1
(
    keycol INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
    datacol NVARCHAR(40) NOT NULL
);

但是,对于实际上需要删除约束名称的约束,如果未明确提供约束名称,则DBMS将自动生成约束名称。在上面的CREATE TABLE语句中,主键将获得一个类似PK__T1__98D78B44D915DA1F的名称。

明确命名主键,外键,唯一约束,检查约束和默认约束将简化数据库表的将来维护。如果您明确命名约束,您将始终清楚地知道约束的方式被命名。如果要删除“无名”约束,则必须首先在数据库的元数据中查找其生成的名称(我认为这非常丑陋和复杂)。