有没有办法在SQL中指定空键?

时间:2014-06-11 14:58:25

标签: sql sql-server sql-server-2012 relational-database rdbms

如果我理解正确,那么在表格上指定一个空键将确保它只包含零行或恰好一行。

是否可以在SQL中指定空键?

3 个答案:

答案 0 :(得分:4)

您可以计算主键:

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');

第一个插入将起作用,但第二个插入将抛出错误:

  

违反PRIMARY KEY约束' PK_T_ID'。无法在对象' dbo.T'中插入重复键。重复键值为(1)。

这将确保您的表包含0行或1行。

答案 1 :(得分:2)

要回答你的实际问题,"是否可以在SQL中指定一个空键" :没有。

就像不可能定义没有列的表(不是同一个问题,但是切向)。

GarethD的答案中的诡计和黑客是必要的。

答案 2 :(得分:0)

拥有一个空键相当于最多只有一个元组。 (最多一个与键值{}相关联的值。)

CHECK有很多限制。在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)值(1),(2)

INSERT语句与CHECK约束“emptyKey”冲突。冲突发生在数据库“db_3_2c694d”,表“dbo.T”:INSERT INTO T(c)VALUES(1),(2)

对于此特定约束,DELETE不支持CHECK,这不是问题。 (但是,在约束中可能存在其他问题,而这些问题没有得到妥善处理。)