标签: constraint

什么时候应该使用唯一约束而不是唯一索引?

当我希望一列具有不同的值时,我可以使用约束

create table t1(
id int primary key,
code varchar(10) unique NULL
);
go
Run Code Online (Sandbox Code Playgroud)

或者我可以使用唯一索引

create table t2(
id int primary key,
code varchar(10) NULL
);
go

create unique index I_t2 on t2(code);
Run Code Online (Sandbox Code Playgroud)

具有唯一约束的列似乎是唯一索引的良好候选者。

是否有任何已知的原因使用唯一约束而不是使用唯一索引?

index sql-server constraint best-practices unique-constraint

238
推荐指数
4
解决办法
11万
查看次数

PostgreSQL 多列唯一约束和 NULL 值

我有一张如下表:

create table my_table (
    id   int8 not null,
    id_A int8 not null,
    id_B int8 not null,
    id_C int8 null,
    constraint pk_my_table primary key (id),
    constraint u_constrainte unique (id_A, id_B, id_C)
);
Run Code Online (Sandbox Code Playgroud)

我想(id_A, id_B, id_C)在任何情况下都与众不同。所以下面的两个插入肯定会导致错误:

INSERT INTO my_table VALUES (1, 1, 2, NULL);
INSERT INTO my_table VALUES (2, 1, 2, NULL);
Run Code Online (Sandbox Code Playgroud)

但它没有按预期运行,因为根据文档,两个NULL值不会相互比较,因此两个插入都没有错误地通过。

我怎么能保证我的唯一约束,即使id_C可以NULL在这种情况下?实际上,真正的问题是:我可以在“纯 sql”中保证这种唯一性,还是必须在更高级别(在我的情况下为 java)来实现它?

postgresql null constraint unique-constraint

137
推荐指数
3
解决办法
13万
查看次数

检查约束只有三列之一为非空

我有一个 (SQL Server) 表,其中包含 3 种类型的结果:FLOAT、NVARCHAR(30) 或 DATETIME(3 个单独的列)。我想确保对于任何给定的行,只有一列有结果,其他列是 NULL。实现这一目标的最简单的检查约束是什么?

这样做的背景是试图改进将非数字结果捕获到现有系统中的能力。使用约束向表中添加两个新列以防止每行超过一个结果是最经济的方法,但不一定是正确的方法。

更新:抱歉,数据类型混乱。可悲的是,我不打算将指示的结果类型解释为 SQL Server 数据类型,只是通用术语,现在已修复。

sql-server constraint

75
推荐指数
3
解决办法
5万
查看次数

如何检查与表相关的外键

如何在MySql中查看与表相关的外键?

背景:我想在 MySql 中删除一个具有外键约束的表。当我这样做时,我得到了这个:

Error Code: 1217. Cannot delete or update a parent row: a foreign key constraint fails

如何删除与表相关的外键离开其他人。

mysql foreign-key constraint drop-table

55
推荐指数
1
解决办法
12万
查看次数

PostgreSQL EXCLUDE USING 错误:数据类型整数没有默认操作符类

在 PostgreSQL 9.2.3 我试图创建这个简化的表:

CREATE TABLE test (
    user_id INTEGER,
    startend TSTZRANGE,
    EXCLUDE USING gist (user_id WITH =, startend WITH &&)
);
Run Code Online (Sandbox Code Playgroud)

但我收到此错误:

ERROR:  data type integer has no default operator class for access method "gist"
HINT:  You must specify an operator class for the index or define
       a default operator class for the data type.
Run Code Online (Sandbox Code Playgroud)

PostgreSQL的文档使用这个例子不为我工作:

CREATE TABLE room_reservation (
    room text,
    during tsrange,
    EXCLUDE USING gist (room WITH =, during WITH &&)
);
Run Code Online (Sandbox Code Playgroud)

同样的错误信息。

而这个对我来说也不起作用: …

postgresql constraint installation exclusion-constraint gist-index

47
推荐指数
2
解决办法
3万
查看次数

MATCH FULL、MATCH SIMPLE 和 MATCH PARTIAL 之间的区别?

我注意到了MATCH SIMPLEMATCH FULL,但我不明白它们是做什么的。我看到默认是MATCH SIMPLE; 但是,约束函数的其他MATCH子句如何FOREIGN KEY

postgresql foreign-key constraint referential-integrity ddl

46
推荐指数
2
解决办法
4万
查看次数

为什么 Postgres 会生成一个已经使用过的 PK 值?

我正在使用 Django,但每隔一段时间我就会收到此错误:

IntegrityError:重复键值违反唯一约束“myapp_mymodel_pkey”
详细信息:键(id)=(1)已经存在。

我的 Postgres 数据库实际上有一个主键为 1的myapp_mymodel对象。

为什么 Postgres 会尝试再次使用该主键?或者,这很可能是我的应用程序(或 Django 的 ORM)导致的吗?

刚才这个问题又连续出现了3次。我发现,当它确实发生时,对于给定的表,它会连续发生一次或多次,然后不会再次发生。它似乎在每张桌子完全停止数天之前发生,当它确实发生时每张桌子至少发生一分钟左右,并且只是间歇性地发生(不是所有桌子都立即发生)。

这个错误是如此间歇性的(在 2 周内仅发生 3 次左右 - 数据库上没有其他负载,只是我测试了我的应用程序)这一事实让我对低级问题如此警惕。

postgresql constraint primary-key postgresql-9.2

41
推荐指数
2
解决办法
5万
查看次数

为什么 UNIQUE 约束只允许一个 NULL?

从技术上讲,NULL = NULL 是 False,根据该逻辑,没有 NULL 等于任何 NULL,并且所有 NULL 都是不同的。这不应该意味着所有 NULL 都是唯一的并且唯一索引应该允许任意数量的 NULL 吗?

null database-design sql-server constraint unique-constraint

37
推荐指数
2
解决办法
5万
查看次数

忽略重复插入的最佳方法?

背景

此问题与使用 PostgreSQL 9.2 或更高版本忽略重复插入有关。我问的原因是因为这段代码:

  -- Ignores duplicates.
  INSERT INTO
    db_table (tbl_column_1, tbl_column_2)
  VALUES (
    SELECT
      unnseted_column,
      param_association
    FROM
      unnest( param_array_ids ) AS unnested_column
  );
Run Code Online (Sandbox Code Playgroud)

代码不受检查现有值的影响。(在这种特殊情况下,用户并不关心插入重复项的错误——插入应该“正常工作”。)在这种情况下添加代码来显式测试重复项会带来复杂性。

问题

在 PostgreSQL 中,我找到了几种忽略重复插入的方法。

忽略重复 #1

创建一个捕获唯一约束违规的事务,不采取任何行动:

  BEGIN
    INSERT INTO db_table (tbl_column) VALUES (v_tbl_column);
  EXCEPTION WHEN unique_violation THEN
    -- Ignore duplicate inserts.
  END;
Run Code Online (Sandbox Code Playgroud)

忽略重复 #2

创建规则以忽略给定表上的重复项:

CREATE OR REPLACE RULE db_table_ignore_duplicate_inserts AS
    ON INSERT TO db_table
   WHERE (EXISTS ( SELECT 1
           FROM db_table
          WHERE db_table.tbl_column = NEW.tbl_column)) DO INSTEAD NOTHING;
Run Code Online (Sandbox Code Playgroud)

问题

我的问题主要是学术性的:

  • 什么方法最有效?
  • 什么方法最容易维护,为什么? …

postgresql constraint insert duplication unique-constraint

35
推荐指数
1
解决办法
9万
查看次数

复制一个表的完整结构

使用某些方法,当您创建表的副本时,您会丢失索引、PK、FK 等。例如在 SQL Server 中,我可以说:

select * into dbo.table2 from dbo.table1;
Run Code Online (Sandbox Code Playgroud)

这只是表格的简单副本;缺少所有索引/约束。如何复制表结构(不使用备份)?

我主要希望手动执行此操作,但如果不可能,我将接受任何解决方案。

schema index sql-server constraint metadata

34
推荐指数
3
解决办法
15万
查看次数