C# 使用t-sql删除表约束后出现newid()问题

C# 使用t-sql删除表约束后出现newid()问题,c#,sql,sql-server,tsql,C#,Sql,Sql Server,Tsql,有一种情况是,我必须在现有表上删除主键,然后在其中插入一条记录。该表有一个名为GUID的列,如下所示 Create Table TEST_TABLE_VALUE ( TEST_TABLE_ID int Identity(1,1), TEST_TABLE_VALUE int, GUID uniqueidentifier Not Null Default newid(), Primary

有一种情况是,我必须在现有表上删除主键,然后在其中插入一条记录。该表有一个名为GUID的列,如下所示

Create Table TEST_TABLE_VALUE (
        TEST_TABLE_ID int Identity(1,1),
        TEST_TABLE_VALUE int,                       
        GUID uniqueidentifier Not Null  Default newid(),
        Primary Key (TEST_TABLE_ID, TEST_TABLE_VALUE)
)
使用下面的代码删除了约束

Declare @TableName nvarchar(100)
Declare @TableId int
Declare @ConstraintName varchar(120)
Declare @IndexName varchar(120)
Declare @Command varchar(256)

Set @TableName = 'TEST_TABLE_VALUE'
Select @TableId = id From sysobjects Where [type]='U' and [name]=@TableName

  Declare ConstraintDropCursor Cursor Local Fast_Forward
  For Select name from sysobjects where (type='K' Or type='D' or type='F' or type='C') and parent_obj = @TableId
  For Read Only
     Open ConstraintDropCursor
       Fetch Next From ConstraintDropCursor Into @ConstraintName
         While @@Fetch_Status != -1
           Begin
             Set @Command = 'Alter Table dbo.' + @TableName + ' Drop Constraint ' + @ConstraintName
             exec(@Command)
             Fetch Next From ConstraintDropCursor Into @ConstraintName
           End
     Close ConstraintDropCursor
     DeAllocate ConstraintDropCursor
在我尝试将数据插入表时删除了约束之后

Insert Into TEST_TABLE_VALUE (TEST_TABLE_VALUE) Values(1)
但得到以下错误:

Cannot insert the value NULL into column 'GUID', table 'CustApp1.dbo.TEST_TABLE_VALUE1'; column does not allow nulls. INSERT fails.

如何解决此问题?

您已删除GUID列的默认值,但它不是可为空的列。因此,它导致了此问题。如果您想插入大量数据,并且可能由于性能原因而不需要约束。然后,至少不要删除不可为null的列的默认值。

您删除了GUID列的默认值,但它不是可为null的列。因此,这是问题的根源。如果您想插入大量数据,并且可能由于性能原因而不需要约束。然后,至少不要删除不可为空的列的默认值。

如果您删除了默认约束,那么您将得到

Create Table TEST_TABLE_VALUE ( 
        TEST_TABLE_ID int Identity(1,1), 
        TEST_TABLE_VALUE int,                        
        GUID uniqueidentifier Not Null, 
        Primary Key (TEST_TABLE_ID, TEST_TABLE_VALUE) 
) 
因此,如果希望继续沿着此路径前进,则必须为GUID列提供一个值

或者也做

ALTER TABLE TEST_TABLE_VALUE ALTER COLUMN GUID uniqueidentifier NULL

允许空值。

如果您放弃了默认约束,那么最终会得到空值

Create Table TEST_TABLE_VALUE ( 
        TEST_TABLE_ID int Identity(1,1), 
        TEST_TABLE_VALUE int,                        
        GUID uniqueidentifier Not Null, 
        Primary Key (TEST_TABLE_ID, TEST_TABLE_VALUE) 
) 
因此,如果希望继续沿着此路径前进,则必须为GUID列提供一个值

或者也做

ALTER TABLE TEST_TABLE_VALUE ALTER COLUMN GUID uniqueidentifier NULL

允许空值。

通常认为您应该删除约束,这表明您做错了什么。这些约束是有原因的。@HLGEM,我删除约束只是为了用正确的名称重新添加它们。在上面的例子中,我忘了添加GUID默认约束。通常认为您应该删除约束,这表明您做错了什么。这些约束是有原因的。@HLGEM,我删除约束只是为了用正确的名称重新添加它们。在上面的例子中,我忘记添加GUID默认约束。