Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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 Server/TSQL使用唯一约束更新表_Sql_Database_Tsql_Database Design_Stored Procedures - Fatal编程技术网

SQL Server/TSQL使用唯一约束更新表

SQL Server/TSQL使用唯一约束更新表,sql,database,tsql,database-design,stored-procedures,Sql,Database,Tsql,Database Design,Stored Procedures,如果我有两张桌子,说: Clients ( ClientID int primary key, ClientName varchar(50) not null ) 及 有了跨(ClientID,IsPrimaryAddress)的唯一约束,如何在不违反约束的情况下从代码集合(而不是单个sql语句)更新这些表 谢谢…在(ClientID,IsPrimaryAddress)之间有一个唯一的约束可能是错误的,除非您想确保一个客户端最多只能有两个地址(一个主地址,另一个主地址),当您尝试添加更

如果我有两张桌子,说:

Clients
(
  ClientID int primary key,
  ClientName varchar(50) not null
)

有了跨
(ClientID,IsPrimaryAddress)
的唯一约束,如何在不违反约束的情况下从代码集合(而不是单个sql语句)更新这些表


谢谢…

在(ClientID,IsPrimaryAddress)之间有一个唯一的约束可能是错误的,除非您想确保一个客户端最多只能有两个地址(一个主地址,另一个主地址),当您尝试添加更多的非主地址时,您将违反完整性约束。

在(ClientID,IsPrimaryAddress)之间设置唯一约束可能是错误的,除非您希望确保一个客户端最多只能有两个地址(一个主地址,另一个主地址),当您试图添加更多的非主地址时,您将违反完整性约束。

正如其他人已经提到的,这里的问题似乎源于过度限制的唯一约束。当一个客户机有两个地址,并且想要交换哪个是主地址时,这可能会给您带来困难。在这种情况下,首先将主地址更新为非主地址,并立即失败,因为同一客户端的两个非主地址违反了约束

因此,当地址是主地址时,只对ClientID强制执行唯一约束就可以解决这个问题。这类问题以前已经在堆栈溢出上讨论过

如果您使用的是Oracle,那么您可以聪明地执行以下操作:

CREATE UNIQUE INDEX unique_primary_addr ON Addresses (
  DECODE (IsPrimaryAddress, 1, ClientId, NULL));
CREATE FUNCTION PrimaryAddressCount(@Id INT) RETURNS INT AS
BEGIN
  DECLARE @ret INT;
  SELECT @ret = COUNT(*) FROM Addresses WHERE ClientId = @Id AND IsPrimaryAddress = 1;
  RETURN @ret;
END;
GO

ALTER TABLE Addresses
  ADD CONSTRAINT SinglePrimaryConstraint
CHECK (IsPrimaryAddress != 1 OR dbo.PrimaryAddressCount(ClientId) = 1);
但我假设您使用的是sql server或其他东西,因此您将被迫执行以下操作:

CREATE UNIQUE INDEX unique_primary_addr ON Addresses (
  DECODE (IsPrimaryAddress, 1, ClientId, NULL));
CREATE FUNCTION PrimaryAddressCount(@Id INT) RETURNS INT AS
BEGIN
  DECLARE @ret INT;
  SELECT @ret = COUNT(*) FROM Addresses WHERE ClientId = @Id AND IsPrimaryAddress = 1;
  RETURN @ret;
END;
GO

ALTER TABLE Addresses
  ADD CONSTRAINT SinglePrimaryConstraint
CHECK (IsPrimaryAddress != 1 OR dbo.PrimaryAddressCount(ClientId) = 1);

无论哪种方式,生成的约束都将允许每个客户机使用任意数量的非主地址,但将强制使用单个主地址。这将使您能够轻松地更新地址,只要您总是最后写入新的主地址。

正如其他人已经提到的,这里的问题似乎源于过度限制的唯一约束。当一个客户机有两个地址,并且想要交换哪个是主地址时,这可能会给您带来困难。在这种情况下,首先将主地址更新为非主地址,并立即失败,因为同一客户端的两个非主地址违反了约束

因此,当地址是主地址时,只对ClientID强制执行唯一约束就可以解决这个问题。这类问题以前已经在堆栈溢出上讨论过

如果您使用的是Oracle,那么您可以聪明地执行以下操作:

CREATE UNIQUE INDEX unique_primary_addr ON Addresses (
  DECODE (IsPrimaryAddress, 1, ClientId, NULL));
CREATE FUNCTION PrimaryAddressCount(@Id INT) RETURNS INT AS
BEGIN
  DECLARE @ret INT;
  SELECT @ret = COUNT(*) FROM Addresses WHERE ClientId = @Id AND IsPrimaryAddress = 1;
  RETURN @ret;
END;
GO

ALTER TABLE Addresses
  ADD CONSTRAINT SinglePrimaryConstraint
CHECK (IsPrimaryAddress != 1 OR dbo.PrimaryAddressCount(ClientId) = 1);
但我假设您使用的是sql server或其他东西,因此您将被迫执行以下操作:

CREATE UNIQUE INDEX unique_primary_addr ON Addresses (
  DECODE (IsPrimaryAddress, 1, ClientId, NULL));
CREATE FUNCTION PrimaryAddressCount(@Id INT) RETURNS INT AS
BEGIN
  DECLARE @ret INT;
  SELECT @ret = COUNT(*) FROM Addresses WHERE ClientId = @Id AND IsPrimaryAddress = 1;
  RETURN @ret;
END;
GO

ALTER TABLE Addresses
  ADD CONSTRAINT SinglePrimaryConstraint
CHECK (IsPrimaryAddress != 1 OR dbo.PrimaryAddressCount(ClientId) = 1);

无论哪种方式,生成的约束都将允许每个客户机使用任意数量的非主地址,但将强制使用单个主地址。这将使您能够轻松地更新地址,只要您总是最后写入新的主地址。

您的集合是什么样子的?如何将其传输到SQL?此约束的一个问题是,每个客户端只能有2个地址(一个主地址,一个不是)。只是不要尝试插入任何违反约束的内容?!?!?恐怕我不太明白你的问题。。。。您需要在这些表上更新什么?您的收藏是什么样子的?如何将其传输到SQL?此约束的一个问题是,每个客户端只能有2个地址(一个主地址,一个不是)。只是不要尝试插入任何违反约束的内容?!?!?恐怕我不太明白你的问题。。。。您需要在这些表上更新什么?