表创建声明

时间:2016-04-28 15:08:01

标签: sql-server tsql database-design

我根据客户的要求创建了一些,我有一个声明,我想知道它是否会失败,或者我是否需要添加一些代码行以便它不会失败。

CREATE TABLE AuditReport
(
    AR_ID INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
    TPPRM_ID NVARCHAR(8) NOT NULL FOREIGN KEY REFERENCES Vendor(TPPRM_ID) ON DELETE CASCADE ON UPDATE CASCADE,
    OR_ID INT NOT NULL FOREIGN KEY REFERENCES OversightResults(OR_ID) ON DELETE CASCADE ON UPDATE CASCADE,
    AR_ReportNAme NVARCHAR(20) NOT NULL,
    AR_Version NVARCHAR(7),
    AR_Type NVARCHAR(20),
    AR_DateCoveragePeriod DATETIME2,
    AR_DateReceived DATETIME2,
    AR_Opinion NVARCHAR(11) CONSTRAINT CHK_Opinion CHECK (AR_Opinion IN ('Qualified','Unqualified')),
    AR_NextReportDate DATETIME2,
    AR_KeyContactName NVARCHAR(30),
    AR_ContactEmail NVARCHAR(40),
    AR_ContactPhoneNumber NVARCHAR(14)
)

--Create OversightResults Table
CREATE TABLE OversightResults
(
    OR_ID INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
    AR_ID INT NOT NULL FOREIGN KEY REFERENCES AuditReport(AR_ID) ON DELETE CASCADE ON UPDATE CASCADE,
    TPPRM_ID NVARCHAR(8) NOT NULL FOREIGN KEY REFERENCES Vendor(TPPRM_ID) ON DELETE CASCADE ON UPDATE CASCADE,
    OR_ServiceObjectives BIT,
    OR_Objectives BIT,
    OR_ControlsTested BIT,
    OR_ManagementUserEntity NVARCHAR(10) CONSTRAINT CHK_ManagementUserEntity CHECK (OR_ManagementUserEntity IN ('Management','User')),
    OR_Controls NVARCHAR(MAX),
    OR_ServicerResponse NVARCHAR(MAX),
    OR_ArvestMitigatingControls NVARCHAR(MAX),
    OR_Deficiency NVARCHAR(10),
    OR_Recommdations NVARCHAR(MAX),
    OR_Observations NVARCHAR(MAX),
    OR_Sufficiency BIT,
    OR_RiskIdentified NVARCHAR(MAX)
)

正如您在表格设计中所见,审计报告表将OR_ID作为外键,而Oversight Results表将其作为主键,而Oversight结果将AR_ID作为外键,审计报告将其作为主键。正如声明现在所说,审计报告表是否无法创建,因为尚未创建以OR_ID作为主键的表?

2 个答案:

答案 0 :(得分:0)

如果这真的是一个1:1的关系,那就把它们全部放在一个表中。如果需要,您可以在该表上创建一些视图以分离结果,例如:

CREATE VIEW vw_OversightResults AS
WITH SCHEMABINDING
SELECT
    OR_ID,
    TPPRM_ID,
    OR_ServiceObjectives,
    OR_Objectives,
    OR_ControlsTested,
    OR_ManagementUserEntity,
    OR_Controls,
    OR_ServicerResponse,
    OR_ArvestMitigatingControls,
    OR_Deficiency,
    OR_Recommdations,
    OR_Observations,
    OR_Sufficiency,
    OR_RiskIdentified
FROM AuditReport

如果需要,也不应该把它变成索引视图......

否则,您需要从两个表中的一个表中删除FK,并在保留它的FK上添加一个UNIQUE索引(可能使其成为PK的一部分?)。但是只要把它放在一张桌子上就不那么容易混淆了。

答案 1 :(得分:0)

这是循环依赖。表格AuditReportOversightResults有关,反之亦然。最好避免这种情况,您可以将其合并为单个表,或者如果需要,还可以创建一个映射表。 如果您需要特定的循环依赖关系,那么您可以按照步骤进行操作。

  1. 创建与AuditReport没有FK关系的表OversightResults
  2. 然后创建OversightResults并与AuditReport相关联。
  3. 更改表格AuditReport并添加FK关系 OversightResults