在T-SQL中添加主键

时间:2018-06-20 09:46:21

标签: tsql primary-key

在T-SQL教程中,我已经看到(至少)有两种不同的方式来创建表或向表添加主键约束,其中一种是在现有表上进行更改(客户):

USE RoomReservation;
GO
ALTER TABLE dbo.Customer ADD CONSTRAINT
     PK_Customer PRIMARY KEY CLUSTERED (CustomerId);

,另一个是在创建Customer表本身时:

USE RoomReservation;
GO
CREATE TABLE dbo.Customer (
    CustomerId INT NOT NULL CONSTRAINT PK_Customer PRIMARY KEY,
    FirstName NVARCHAR(50) NOT NULL, 
    LastName NVARCHAR(50) NOT NULL);

我的问题是:

同一主键属性的CustomerIdPK_Customer两个不同的名称吗?

它们是两个具有相同值的副本的不同属性吗?

无论是名称还是价值,这种冗余有什么用?

1 个答案:

答案 0 :(得分:0)

  

同一主键属性的CustomerId和PK_Customer 2是否不同?

不,他们不一样。实际上,它们是两个不同的对象(列!=约束):

CustomerId   -- name of column
PK_Customer  -- name of constraint

例如,如果您省略PRIMARY KEY约束的名称,它将自动生成:

CREATE TABLE dbo.Customer (
    CustomerId INT NOT NULL CONSTRAINT PK_Customer PRIMARY KEY,
    FirstName NVARCHAR(50) NOT NULL, 
    LastName NVARCHAR(50) NOT NULL);

SELECT name, object_id, parent_object_id, type_desc
FROM sys.objects
WHERE parent_object_id = OBJECT_ID('dbo.Customer');

┌─────────────┬───────────┬──────────────────┬────────────────────────┐
│    name     │ object_id │ parent_object_id │       type_desc        │
├─────────────┼───────────┼──────────────────┼────────────────────────┤
│ PK_Customer │ 917578307 │        901578250 │ PRIMARY_KEY_CONSTRAINT │
└─────────────┴───────────┴──────────────────┴────────────────────────┘


DROP TABLE dbo.Customer;
CREATE TABLE dbo.Customer (
    CustomerId INT NOT NULL PRIMARY KEY,
    FirstName NVARCHAR(50) NOT NULL, 
    LastName NVARCHAR(50) NOT NULL);

SELECT name, object_id, parent_object_id, type_desc
FROM sys.objects
WHERE parent_object_id = OBJECT_ID('dbo.Customer');

┌────────────────────────────────┬───────────┬──────────────────┬────────────────────────┐
│              name              │ object_id │ parent_object_id │       type_desc        │
├────────────────────────────────┼───────────┼──────────────────┼────────────────────────┤
│ PK__Customer__A4AE64D8749AE915 │ 949578421 │        933578364 │ PRIMARY_KEY_CONSTRAINT │
└────────────────────────────────┴───────────┴──────────────────┴────────────────────────┘

DBFiddle Demo

  

它们是两个具有相同值的副本的不同属性吗?

不,它们根本不是副本。我猜因为内联PRIMARY KEY的定义,这可能会造成混淆。您可以将其分开:

CREATE TABLE dbo.Customer (
    CustomerId INT NOT NULL ,
    FirstName NVARCHAR(50) NOT NULL, 
    LastName NVARCHAR(50) NOT NULL,
    CONSTRAINT PK_Customer PRIMARY KEY  -- out of the line
);

或什至在多列上(内联语法也不可能):

CREATE TABLE dbo.InvoiceLine (
    InvoiceId INT,
    InvoiceLine INT,
    Description VARCHAR(100),
    CONSTRAINT PK_InvoiceLine PRIMARY KEY(InvoiceId, InvoiceLine)
);