Gle*_*nnS 144 sql-server constraints alter-table code-maintainability
在SQL Server中,我在表上有一个新列:
ALTER TABLE t_tableName
ADD newColumn NOT NULL
Run Code Online (Sandbox Code Playgroud)
这失败是因为我指定了NOT NULL而没有指定默认约束.该表不应具有默认约束.
为了解决这个问题,我可以使用默认约束创建表,然后将其删除.
但是,似乎没有任何方法可以指定默认约束应该作为此语句的一部分命名,因此我摆脱它的唯一方法是使用一个存储过程在sys.default_constraints中查找它表.
对于可能发生很多事情的操作来说,这有点混乱/冗长.有没有人有更好的解决方案呢?
Joe*_*lli 202
这应该工作:
ALTER TABLE t_tableName
ADD newColumn VARCHAR(50)
CONSTRAINT YourContraintName DEFAULT '' NOT NULL
Run Code Online (Sandbox Code Playgroud)
Mit*_*eat 91
ALTER TABLE t_tableName
ADD newColumn int NOT NULL
CONSTRAINT DF_defaultvalue DEFAULT (1)
Run Code Online (Sandbox Code Playgroud)
Shn*_*ugo 23
我想补充一些细节:
最重要的提示是:您永远不应该创建没有明确名称的约束!
未命名约束的最大问题:当您在各种客户机器上执行此操作时,您将在每台机器上获得不同/随机的名称。
任何未来的升级脚本都将是一个真正令人头疼的问题......
一般建议是:
DF_TableName_ColumnName 对于默认约束CK_TableName_ColumnName 对于检查约束UQ_TableName_ColumnName 对于唯一约束PK_TableName 对于主键约束一般语法是
TheColumn <DataType> Nullability CONSTRAINT ConstraintName <ConstraintType> <ConstraintDetails>
Run Code Online (Sandbox Code Playgroud)
在这里试试这个
您可以向每列添加更多约束,并且可以像在逗号后添加列一样添加其他约束:
CREATE TABLE dbo.SomeOtherTable(TheIdThere INT NOT NULL CONSTRAINT PK_SomeOtherTable PRIMARY KEY)
GO
CREATE TABLE dbo.TestTable
(
--define the primary key
ID INT IDENTITY NOT NULL CONSTRAINT PK_TestTable PRIMARY KEY
--let the string be unique (results in a unique index implicitly)
,SomeUniqueString VARCHAR(100) NOT NULL CONSTRAINT UQ_TestTable_SomeUniqueString UNIQUE
--define two constraints, one for a default value and one for a value check
,SomeNumber INT NULL CONSTRAINT DF_TestTable_SomeNumber DEFAULT (0)
CONSTRAINT CK_TestTable_SomeNumber_gt100 CHECK(SomeNumber>100)
--add a foreign key constraint
,SomeFK INT NOT NULL CONSTRAINT FK_TestTable_SomeFK FOREIGN KEY REFERENCES dbo.SomeOtherTable(TheIdThere)
--add a constraint for two columns separately
,CONSTRAINT UQ_TestTable_StringAndNumber UNIQUE(SomeFK,SomeNumber)
);
GO
Run Code Online (Sandbox Code Playgroud)
--插入一些数据
INSERT INTO dbo.SomeOtherTable VALUES(1);
INSERT INTO dbo.TestTable(SomeUniqueString,SomeNumber,SomeFK) VALUES('hello',111,1);
GO
INSERT INTO dbo.TestTable(SomeUniqueString,SomeNumber,SomeFK)
VALUES('fails due to uniqueness of 111,1',111,1);
Run Code Online (Sandbox Code Playgroud)