当我希望一列具有不同的值时,我可以使用约束
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
我有一张如下表:
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)来实现它?
我有一个 (SQL Server) 表,其中包含 3 种类型的结果:FLOAT、NVARCHAR(30) 或 DATETIME(3 个单独的列)。我想确保对于任何给定的行,只有一列有结果,其他列是 NULL。实现这一目标的最简单的检查约束是什么?
这样做的背景是试图改进将非数字结果捕获到现有系统中的能力。使用约束向表中添加两个新列以防止每行超过一个结果是最经济的方法,但不一定是正确的方法。
更新:抱歉,数据类型混乱。可悲的是,我不打算将指示的结果类型解释为 SQL Server 数据类型,只是通用术语,现在已修复。
如何在MySql中查看与表相关的外键?
背景:我想在 MySql 中删除一个具有外键约束的表。当我这样做时,我得到了这个:
Error Code: 1217. Cannot delete or update a parent row: a foreign key constraint fails
如何删除与表相关的外键离开其他人。
在 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)
但我收到此错误:
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.
在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
我注意到了MATCH SIMPLE和MATCH FULL,但我不明白它们是做什么的。我看到默认是MATCH SIMPLE; 但是,约束函数的其他MATCH子句如何FOREIGN KEY?
我正在使用 Django,但每隔一段时间我就会收到此错误:
IntegrityError:重复键值违反唯一约束“myapp_mymodel_pkey”
详细信息:键(id)=(1)已经存在。
我的 Postgres 数据库实际上有一个主键为 1的myapp_mymodel对象。
为什么 Postgres 会尝试再次使用该主键?或者,这很可能是我的应用程序(或 Django 的 ORM)导致的吗?
刚才这个问题又连续出现了3次。我发现,当它确实发生时,对于给定的表,它会连续发生一次或多次,然后不会再次发生。它似乎在每张桌子完全停止数天之前发生,当它确实发生时每张桌子至少发生一分钟左右,并且只是间歇性地发生(不是所有桌子都立即发生)。
这个错误是如此间歇性的(在 2 周内仅发生 3 次左右 - 数据库上没有其他负载,只是我测试了我的应用程序)这一事实让我对低级问题如此警惕。
从技术上讲,NULL = NULL 是 False,根据该逻辑,没有 NULL 等于任何 NULL,并且所有 NULL 都是不同的。这不应该意味着所有 NULL 都是唯一的并且唯一索引应该允许任意数量的 NULL 吗?
null database-design sql-server constraint unique-constraint
此问题与使用 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 中,我找到了几种忽略重复插入的方法。
创建一个捕获唯一约束违规的事务,不采取任何行动:
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)
创建规则以忽略给定表上的重复项:
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)
我的问题主要是学术性的:
使用某些方法,当您创建表的副本时,您会丢失索引、PK、FK 等。例如在 SQL Server 中,我可以说:
select * into dbo.table2 from dbo.table1;
Run Code Online (Sandbox Code Playgroud)
这只是表格的简单副本;缺少所有索引/约束。如何复制表结构(不使用备份)?
我主要希望手动执行此操作,但如果不可能,我将接受任何解决方案。
constraint ×10
postgresql ×5
sql-server ×4
foreign-key ×2
index ×2
null ×2
ddl ×1
drop-table ×1
duplication ×1
gist-index ×1
insert ×1
installation ×1
metadata ×1
mysql ×1
primary-key ×1
schema ×1