有没有办法在SQL中指定空键?
如果我理解正确,那么在表上指定一个空键将确保它只包含零行或正好一行有没有办法在SQL中指定空键?,sql,sql-server,sql-server-2012,relational-database,rdbms,Sql,Sql Server,Sql Server 2012,Relational Database,Rdbms,如果我理解正确,那么在表上指定一个空键将确保它只包含零行或正好一行 是否可以在SQL中指定空键?您可以计算主键: CREATE TABLE T ( ID AS 1, SomeField VARCHAR(100), CONSTRAINT PK_T_ID PRIMARY KEY (ID) ); INSERT T (SomeField) VALUES ('Test'); INSERT T (SomeField) VALUES ('Test2'); 第
是否可以在SQL中指定空键?您可以计算主键:
CREATE TABLE T
(
ID AS 1,
SomeField VARCHAR(100),
CONSTRAINT PK_T_ID PRIMARY KEY (ID)
);
INSERT T (SomeField) VALUES ('Test');
INSERT T (SomeField) VALUES ('Test2');
第一次插入将起作用,但第二次插入将抛出错误:
违反主键约束“PK\u T\u ID”。无法在对象“dbo.T”中插入重复键。重复的键值为(1)
这将确保表包含0或1行。您可以计算主键:
CREATE TABLE T
(
ID AS 1,
SomeField VARCHAR(100),
CONSTRAINT PK_T_ID PRIMARY KEY (ID)
);
INSERT T (SomeField) VALUES ('Test');
INSERT T (SomeField) VALUES ('Test2');
第一次插入将起作用,但第二次插入将抛出错误:
违反主键约束“PK\u T\u ID”。无法在对象“dbo.T”中插入重复键。重复的键值为(1)
这将确保表包含0或1行。具有空键相当于最多具有一个元组。(最多一个与键值{}关联的值。) 支票有很多限制。在SQL Server中,可以编写函数
CREATE TABLE T (c int);
GO
CREATE FUNCTION f()
RETURNS int
AS
BEGIN
DECLARE @retval int
SELECT @retval = COUNT(*) FROM T
RETURN @retval
END;
GO
ALTER TABLE T
ADD CONSTRAINT emptyKey CHECK (dbo.f() <= 1 );
GO
创建表T(c int);
去
创建函数f()
返回整数
像
开始
声明@retval int
从T中选择@retval=COUNT(*)
返回@retval
终止
去
改变表T
添加约束emptyKey CHECK(dbo.f()具有空键相当于最多具有一个元组。(最多一个值与键值{}关联。)
检查有很多限制。在SQL Server中可以编写函数
CREATE TABLE T (c int);
GO
CREATE FUNCTION f()
RETURNS int
AS
BEGIN
DECLARE @retval int
SELECT @retval = COUNT(*) FROM T
RETURN @retval
END;
GO
ALTER TABLE T
ADD CONSTRAINT emptyKey CHECK (dbo.f() <= 1 );
GO
创建表T(c int);
去
创建函数f()
返回整数
像
开始
声明@retval int
从T中选择@retval=COUNT(*)
返回@retval
终止
去
改变表T
添加约束emptyKey CHECK(dbo.f()以回答实际问题,“是否可以在SQL中指定空键”:否
就像不可能定义没有列的表一样(不是同一个问题,而是相切的)
GarethD回答中的技巧和黑客是必要的。要回答您的实际问题,“是否可以在SQL中指定空键”:否
就像不可能定义没有列的表一样(不是同一个问题,而是相切的)
GarethD回答中的技巧和黑客是必要的。您使用的是什么RDBMS,您的目标是什么?我怀疑大多数人会报告一个零长度索引的错误(如果这是您的意思的话)。(MySQL的快速测试验证了-索引长度不能为0)我们使用的是Microsoft SQL Server 2012。我认为这在我希望在表中只存储一个值的情况下非常有用。例如,全局应用程序设置。您使用的是什么RDBMS,您的目标是什么?我怀疑大多数人都会报告一个长度为零的索引错误(如果这是您的意思的话)。(MySQL的快速测试验证了-index长度不能为0)我们使用Microsoft SQL Server 2012。我认为这在我希望在表中只存储一个值的情况下非常有用。例如,全局应用程序设置。回答得好。我会做一个小小的修改。ID不是此表的主键。唯一的候选键是()-空集。因此,为了清晰和准确起见,最好使用唯一键约束来代替主键,即使它们在实践中实现了相同的效果。@GarethD——这个问题的有趣方法。回答得好。我会做一个小小的修改。ID不是这个表的主键。唯一的候选键是()-空集。因此,为了清晰和准确起见,最好使用唯一键约束代替主键,即使它们在实践中实现了相同的效果。@GarethD——解决这个问题的有趣方法。这是一个好主意,但检查约束不能包含聚合函数。这是一个好主意,但是一个eck约束不能包含聚合函数。