我有几列与UNIQUE INDEX. 在某些查询中,重复应该是可以接受的,其中应该将后缀添加到值中。例如,如果test title退出,我们将其更改为test title-2。
有没有办法让一个独特的价值DUPLICATE?
INSERT INTO table1
(title, abr, name)
VALUES
('title', 'abr', 'name')
Run Code Online (Sandbox Code Playgroud)
在这个典型示例中,所有三列都是UNIQUE. 当INSERT失败时,我不知道是哪个col导致错误改变了它对应的值。
如何进行查询value以value-identifier在重复错误时更改为?
鉴于以下 CREATE TABLE 语句:
CREATE TABLE [dbo].[Unit]
(
[id] SMALLINT NOT NULL IDENTITY(1,1),
[name] VARCHAR(100) NOT NULL,
CONSTRAINT [PK_Unit] PRIMARY KEY CLUSTERED ([id]),
CONSTRAINT [UQ_Unit_Name] UNIQUE ([name])
)
Run Code Online (Sandbox Code Playgroud)
如何在不违反 UNIQUE 约束的情况下允许以下两个字符串共存?
INSERT INTO dbo.Unit (Name) VALUES('e³m³/day')
INSERT INTO dbo.Unit (Name) VALUES('e3m3/day')
Run Code Online (Sandbox Code Playgroud)
任何见解表示赞赏。
编辑
当前整理是 Latin1_General_CI_AS
编辑
除非有人有更好的选择,否则我似乎必须使用 Latin1_General_BIN 并在我需要的几个地方手动处理 CI……如果没有提供更好的解决方案,我会将其转换为答案。
sql-server constraint sql-server-2008-r2 string unique-constraint
在我的 MySQL 数据库中,我有一个包含 4 列的表,其中PRIMRAY KEY两列带有FOREIGN KEY CONSTRAINT一个UNIQUE 索引和一个索引,除了PRIMARY KEY.
的SHOW CREATE TABLE:
CREATE TABLE `zdb_userbeschikbaarheid` (
`UserBeschikbaarheid_ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`UB_User_ID` int(10) unsigned NOT NULL,
`UB_PlanDagdeelTaak_ID` int(10) unsigned NOT NULL,
`UB_Datum` date NOT NULL,
PRIMARY KEY (`UserBeschikbaarheid_ID`),
UNIQUE KEY `UQ_UB_User_ID_PlanDagdeelTaak_ID_Datum` (`UB_Datum`,`UB_User_ID`,`UB_PlanDagdeelTaak_ID`),
KEY `FK_UB_User_ID` (`UB_User_ID`),
KEY `FK_UB_PlanDagdeelTaak_ID` (`UB_PlanDagdeelTaak_ID`),
CONSTRAINT `FK_UB_PlanDagdeelTaak_ID` FOREIGN KEY (`UB_PlanDagdeelTaak_ID`) REFERENCES `zdb_plandagdeeltaak` (`PlanDagdeelTaak_ID`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `FK_UB_User_ID` FOREIGN KEY (`UB_User_ID`) …Run Code Online (Sandbox Code Playgroud) 我正在使用 PostgreSQL 9.3。假设我们正在制造某种类型的某些物品,在任何时候我们最多只能生产某种类型的一件物品。下表记录了我们制造物品的历史记录,其中可能有一行manufactured_until是null- 这些是当前生产的物品。
create table item
(
id int,
type_id int,
manufactured_from timestamp,
manufactured_until timestamp
)
Run Code Online (Sandbox Code Playgroud)
样本数据:
1 | 101 | 1.1.2000 | 31.12.2012
2 | 102 | 1.4.2003 | 1.1.2010
3 | 101 | 1.1.2013 |
4 | 102 | 2.1.2010 | 4.5.2014
5 | 102 | 5.5.2014 |
Run Code Online (Sandbox Code Playgroud)
以下逻辑应该成立:对于每种物品类型,此时最多应该生产一个物品 ( manufactured IS NULL)。在示例中,我应该无法添加记录(6, 101, 27.8.2014, NULL)。
我想写一个UNIQUE约束来保护它。是否可以?对于奖励积分,是否有一种相当复杂的方法来保护一种项目类型的间隔不重叠?
postgresql database-design exclusion-constraint unique-constraint
我正在尝试创建一个过程,该过程将从临时表中获取值,并将它们加载到另一个表中。第二个表在其三列(不包括主键)上有一个复合唯一约束我正在使用合并语句尝试处理上传,并不断收到错误消息,提示消息 2627,级别 14,状态 1,第 13 行
Violation of UNIQUE KEY constraint 'IX_table'.
Cannot insert duplicate key in object 'dbo.table'. The duplicate key value is (aaa, aaa, aaa).
Run Code Online (Sandbox Code Playgroud)
我真的很困惑,因为我使用合并语句的全部原因是为了防止这种情况发生。这是过程的相关部分(名称已更改,并且对临时表的插入已更改)
create table #TempTable(Id int
, str1 varchar(3)
, str2 varchar(15)
, str3 varchar(10))
INSERT INTO #TempTable
(str1
,str2
,str3)
VALUES
('aaa','aaa','aaa'), ('bbb', 'bbb', 'bbb'), ('aaa','aaa','aaa')
MERGE dbo.table AS t
USING #TempTable AS s
ON (t.str1 = s.str1
AND t.str2 = s.str2
AND t.str3 = s.str3)
WHEN MATCHED THEN
UPDATE SET t.str1 = …Run Code Online (Sandbox Code Playgroud) 出于性能原因,我正在编写一个大型的多步 CTE 。
在一个查询中,数据必须从一个表移动到另一个表,但移动的行数是不确定的,可能为零。
在后续表中,删除来自前一个查询的源,但必须在完成前一个查询之后。
最后,在上面的第二个查询完成后,必须写入行来代替已删除的行。
在前两个查询中,我使用 RETURNING 来强制执行顺序。
在第二个查询中,我确定第一个查询是由这个子查询完成的
(SELECT COUNT(*) FROM first_query) >= 0
Run Code Online (Sandbox Code Playgroud)
在第三个查询中,我确定第二个查询是由这个子查询完成的
SELECT EXISTS (SELECT 1 FROM second_query)
Run Code Online (Sandbox Code Playgroud)
确定第一个查询已完成的子查询是否正确?
用于确定必须返回行的第二个查询已完成最佳准确性、精度和性能的子查询?
使用上述子查询来强制执行顺序会导致重复的键值违规。
查询小节
WITH copy_to_other_table AS (
INSERT INTO other_table (column_a, column_b)
SELECT column_a, column_b
FROM main_table
WHERE column_a = $1::bigint
RETURNING *
),
main_table_deleted AS (
DELETE FROM main_table WHERE column_a = $1::bigint
AND (SELECT COUNT(*) FROM copy_to_other_table) >= 0
RETURNING *
)
INSERT INTO main_table (column_a, column_b)
SELECT column_a, column_b
FROM another_table …Run Code Online (Sandbox Code Playgroud) 要在 postgres 中强制执行部分唯一性,创建部分唯一索引而不是显式约束是一种众所周知的解决方法,如下所示:
CREATE TABLE possession (
possession_id serial PRIMARY KEY,
owner_id integer NOT NULL REFERENCES owner(owner_id),
special boolean NOT NULL DEFAULT false
);
CREATE UNIQUE INDEX possession_unique_special ON possession(owner_id, special) WHERE special = true;
Run Code Online (Sandbox Code Playgroud)
这将限制每个所有者在数据库级别拥有不超过一个特殊财产。显然,创建跨多个表的索引是不可能的,因此在列存在于不同表中的超类型和子类型情况下,此方法不能用于强制执行部分唯一性。
CREATE TABLE possession (
possession_id serial PRIMARY KEY,
owner_id integer NOT NULL REFERENCES owner(owner_id)
);
CREATE TABLE toy (
possession_id integer PRIMARY KEY REFERENCES possession(possession_id),
special boolean NOT NULL DEFAULT false
);
Run Code Online (Sandbox Code Playgroud)
如您所见,在此示例中,较早的方法不允许将每个所有者限制为不超过一个特殊玩具。假设每个财产都必须实现一个子类型,那么在不大量改变原始表的情况下在 postgres 中强制执行此约束的最佳方法是什么?
我有一个包含用户的表。每个用户都有一个主电子邮件和一个指示该用户是否被删除的标志(我们从不硬删除用户)。
但是,每个用户还可以拥有额外的电子邮件。
无论如何,电子邮件地址必须是唯一的,我想在数据库级别强制执行这一点。对于主要电子邮件地址来说这很简单。我可以简单地添加一个带有WHERE not is_deleted限制的 UNIQUE 索引,以便可以重新使用已删除的用户的电子邮件。
然而,对于辅助电子邮件来说,这就更加棘手。
is_deleted用户的标志复制到该表,这也很丑陋,但允许我简单地使用 UNIQUE 索引与WHERE not is_deleted.有没有更好的解决方案来实现我想要做的事情?
postgresql foreign-key database-design constraint unique-constraint
在附录 A:PostgreSQL 错误代码中,它说:
对于某些类型的错误,服务器会报告与错误关联的数据库对象(表、表列、数据类型或约束)的名称;例如,导致 unique_violation 错误的唯一约束的名称。此类名称在错误报告消息的单独字段中提供,以便应用程序无需尝试从消息的可能本地化的人类可读文本中提取它们。
大胆强调我的。我有下表:
CREATE TABLE recipes (
id SERIAL,
title TEXT UNIQUE NOT NULL,
description TEXT NOT NULL,
instructions TEXT NOT NULL,
image BYTEA,
CONSTRAINT recipes_pk PRIMARY KEY(id),
CONSTRAINT title_unique UNIQUE(title)
);
Run Code Online (Sandbox Code Playgroud)
当我尝试插入具有重复标题的新行时,我在 pgAdmin3 中收到以下错误消息:
ERROR: duplicate key value violates unique constraint "title_unique"
DETAIL: Key (title)=(mytitle) already exists.
Run Code Online (Sandbox Code Playgroud)
或者,使用 PHP:
["errorInfo"]=>
array(3) {
[0]=>
string(5) "23505"
[1]=>
int(7)
[2]=>
string(117) "ERROR: duplicate key value violates unique constraint "title_unique"
DETAIL: Key (title)=(mytitle) already exists." …Run Code Online (Sandbox Code Playgroud) 下面是一个脚本,可用于重现我面临的问题。基本上问题是这样的:为什么(ID1 = 6,ID2 = 7)的记录没有填充到最终的#tt2表中?我可以手动插入它,所以它不会违反 UNIQUE 约束,但它不会作为 INSERT/SELECT 的一部分进行填充。
USE [tempdb]
GO
IF OBJECT_ID('tempdb..#t1') IS NOT NULL DROP TABLE #t1
CREATE TABLE [#t1] ([ID] INT , [V] VARCHAR(10))
INSERT INTO #t1 (ID, V)
VALUES
(1,'A'),
(2,'B'),
(3,'B'),
(4,'C'),
(5,'E'),
(6,'E')
IF OBJECT_ID('tempdb..#t2') IS NOT NULL DROP TABLE #t2
CREATE TABLE [#t2] ([ID] INT , [V] VARCHAR(10))
INSERT INTO #t2 (ID, V)
VALUES
(1,'A'),
(2,'B'),
(3,'C'),
(4,'C'),
(5,'D'),
(6,'E'),
(7,'E')
IF OBJECT_ID('tempdb..#tt') IS NOT NULL DROP TABLE #tt
SELECT t1.ID AS …Run Code Online (Sandbox Code Playgroud) postgresql ×5
sql-server ×3
constraint ×2
mysql ×2
cte ×1
duplication ×1
foreign-key ×1
inheritance ×1
innodb ×1
merge ×1
mysql-5.6 ×1
php ×1
primary-key ×1
string ×1
t-sql ×1