Sql-Server

具有多個空列的唯一約束

  • January 15, 2018

我有兩張桌子

PC(身份證,EmpName Not NULL, PCName NULL, HostName NULL,.... PhysicalLocation NULL, PCType Not NULL) PCNetwork(號碼, EmpName Not NULL, PCName NULL, HostName NULL,IPAddr,....,PhysicalLocation NULL, PCType Not NULL)

Id是代理鍵,EmpName並且PCType不是空欄位,其餘可以為空。我使用這些列在 PC 上創建了 Unique Constraint,並在 PCNetwork 上創建了 FK。如果記錄的一列中有空值,則約束完美,但如果多於一列有空值,則約束不起作用。這是這篇文章的後續問題

編輯:- 我的唯一約束和外鍵約束不起作用

alter table PC add constraint UK_PC_EMPName_PCName_PCType unique (EMPName, PCName, HostName, PhysicalLocation, PCType);

alter table PCNetwork add constraint FK_PC_PCNetwork foreign key (EMPName, PCName, HostName, PhysicalLocation, PCType) references PC (EMPName, PCName, HostName, PhysicalLocation, PCType);

我認為您的數據庫存在錯誤的數據模型。您可能需要重新考慮一下,從您提到的表來看,模型沒有很好地規範化,並且您正試圖強制對錶列執行外鍵引用,而該列實際上並不是任何事情的關鍵。一種方法是這樣的:

CREATE TABLE EMP (ID INT PRIMARY KEY IDENTITY
                ,EmpName VARCHAR(100) NULL)

CREATE TABLE PCTypes (id INT PRIMARY KEY IDENTITY
                    ,PcTypeName VARCHAR(100) NULL)

CREATE TABLE PC (Id INT PRIMARY KEY IDENTITY
               ,EmpId INT NULL
               ,PCName VARCHAR(100) NULL
               ,HostName VARCHAR(100) NULL
               ,PhysicalLocation VARCHAR(100) NULL
               ,PCType INT NULL)

ALTER TABLE PC ADD CONSTRAINT FK_PC_EmpId FOREIGN KEY (empId) REFERENCES Emp(id)
ALTER TABLE PC ADD CONSTRAINT FK_PC_PCType FOREIGN KEY (PCType) REFERENCES PCTypes(id)

CREATE TABLE PCNetwork (Id INT PRIMARY KEY IDENTITY
                      ,NetworkName VARCHAR(100) NULL
                      ,EmpId INT NULL
                      ,PhysicalLocation VARCHAR(100) NULL)

ALTER TABLE PCNetwork ADD CONSTRAINT FK_PCNetwork_EmpId FOREIGN KEY (empId) REFERENCES Emp(id)

CREATE TABLE PCNetwork_PCs (PCNetworkId INT NOT NULL
                          ,PCId INT NOT NULL
                          ,IPAddr NVARCHAR(20) NULL)

ALTER TABLE PCNetwork_PCs ADD CONSTRAINT FK_PCNetwork_PCs_Network FOREIGN KEY (PCNetworkId) REFERENCES PCNetwork(id)
ALTER TABLE PCNetwork_PCs ADD CONSTRAINT FK_PCNetwork_PCs_PC FOREIGN KEY (PCId) REFERENCES PC(id)
CREATE UNIQUE INDEX uq_pcnetworks ON PCNetwork_PCs(PCNetworkId, PCId)
CREATE UNIQUE INDEX uq_pcnetworks_ip ON PCNetwork_PCs(IPAddr)

引用自:https://dba.stackexchange.com/questions/40226