Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server 2000表是否可以没有主键,因此包含重复记录?_Sql Server_Sql Server 2000 - Fatal编程技术网

Sql server SQL Server 2000表是否可以没有主键,因此包含重复记录?

Sql server SQL Server 2000表是否可以没有主键,因此包含重复记录?,sql-server,sql-server-2000,Sql Server,Sql Server 2000,我有一个审计表,而不是定义一个标识或有标记的列,我正在考虑只推入记录表的记录(通过触发器) SQL Server 2000表是否可以没有主键,因此包含重复记录 如果是,我所要做的是创建表而不定义任何约束吗?是没有主键或唯一约束的表可以有重复的行 比如说 CREATE TABLE bla(ID INT) INSERT bla (ID) VALUES(1) INSERT bla (ID) VALUES(1) INSERT bla (ID) VALUES(1) SELECT * FROM bl

我有一个审计表,而不是定义一个标识或有标记的列,我正在考虑只推入记录表的记录(通过触发器)

SQL Server 2000表是否可以没有主键,因此包含重复记录


如果是,我所要做的是创建表而不定义任何约束吗?

是没有主键或唯一约束的表可以有重复的行

比如说

CREATE TABLE bla(ID INT)


INSERT bla (ID) VALUES(1)
INSERT bla (ID) VALUES(1)
INSERT bla (ID) VALUES(1)


SELECT * FROM bla
GO

是的,SQL Server 2000表可以没有主键并且包含重复的记录;是的,您可以简单地创建一个表,而无需对其定义任何约束。不过,我不建议这样做

相反,因为您正在为另一个表创建审核表。假设在本例中,您有一个Person表和一个Person Audit表,用于跟踪Person表中的更改

像这样创建审计表

CREATE TABLE dbo.PersonAuditID
(
  PersonAuditID int NOT NULL IDENTITY (1, 1),
  PersonId int NOT NULL,
  FirstName nvarchar(50) NOT NULL,
  LastName nvarchar(50) NOT NULL,
  PersonWhoMadeTheChange nvarchar(100) NOT NULL,
  TimeOfChange datetime NOT NULL,
  ChangeAction int NOT NULL,
  /* any other fields here*/
  CONSTRAINT [PK_PersonAudit] PRIMARY KEY NONCLUSTERED 
  (
[PersonAuditID] ASC
  )
)  ON [PRIMARY]
这将为您提供一个主键,并保留表的唯一记录。它还提供了跟踪谁进行了更改、何时进行更改以及更改是否为插入、更新或删除的功能

您的触发器如下所示

CREATE TRIGGER Insert_PERSON
   ON  PERSON
   AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;
    INSERT INTO PERSONAUDIT
    (PersonID, 
     FirstName, 
     LastName, 
     PersonWhoMadeTheChange, 
     TimeOfChange, 
     ChangeAction,
     ... other fields here
     SELECT 
       PersonID,
       FirstName,
       LastName,
       User(),
       getDate(),
       1,
       ... other fields here
     FROM INSERTED

END

CREATE TRIGGER Update_PERSON
   ON  PERSON
   AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;
    INSERT INTO PERSONAUDIT
    (PersonID, 
     FirstName, 
     LastName, 
     PersonWhoMadeTheChange, 
     TimeOfChange, 
     ChangeAction,
     ... other fields here
     SELECT 
       PersonID,
       FirstName,
       LastName,
       User(),
       getDate(),
       2,
       ... other fields here
     FROM INSERTED

END

CREATE TRIGGER Delete_PERSON
   ON  PERSON
   AFTER DELETE
AS 
BEGIN
    SET NOCOUNT ON;
    INSERT INTO PERSONAUDIT
    (PersonID, 
     FirstName, 
     LastName, 
     PersonWhoMadeTheChange, 
     TimeOfChange, 
     ChangeAction,
     ... other fields here
     SELECT 
       PersonID,
       FirstName,
       LastName,
       User(),
       getDate(),
       3,
       ... other fields here
     FROM DELETED

END

SQL Server 2000+,可以有没有PK的表。是的,您通过使用约束来创建它们。

是的,这是可能的,但不一定是个好主意。如果没有主键,复制和高效索引将非常困难。

对于审核表,您需要考虑使用审核数据的目的。即使您在进行审计时没有专门用于在发生不幸更改时恢复记录,它们也不可避免地被用于此目的。如果您有一个代理密钥,可以防止您在只需要最新的记录时意外还原30个其他条目,那么识别要还原的记录会更容易吗?键值是否有助于您识别在一批中删除并需要恢复的32578条记录


我们对审计所做的是为每个表创建两个表,其中一个表存储有关已更改记录批次的信息,包括自动递增的id、用户、应用程序、日期时间和受影响记录的数量。然后,子表将ID用作fk,并存储有关插入/更新/删除的每条记录的新旧值的详细信息。当流程错误导致许多记录意外更改时,这确实对我们有所帮助

看起来你的答案的最后一点是缺少答案。但是,我有一个“on edit:insert”触发器,其中主表的PK元组可以将PK相同的记录插入审核表。@ppecher由于标识列和主键的原因,此结构将无法为PersonAudit表输入相同的记录。但是,它允许您在PersonAudit表中输入相同的Person表记录。标识列不能保证唯一性,它只会鼓励唯一性。如果我愿意,我可以很容易地在您的表中放置重复项。@John Hartsock:好的,我想我会这样做:您假设审计表添加了PersonAuditID和ChangeAction,并使用前者作为PK的一部分(以便保证它是唯一的)?