在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);
我的问题是:
同一主键属性的CustomerId
和PK_Customer
两个不同的名称吗?
它们是两个具有相同值的副本的不同属性吗?
无论是名称还是价值,这种冗余有什么用?
答案 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 │
└────────────────────────────────┴───────────┴──────────────────┴────────────────────────┘
它们是两个具有相同值的副本的不同属性吗?
不,它们根本不是副本。我猜因为内联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)
);