Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.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中指定空键?_Sql_Sql Server_Sql Server 2012_Relational Database_Rdbms - Fatal编程技术网

有没有办法在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约束不能包含聚合函数。