标签: constraint

如何从所有表中删除所有约束?

我想从 SQL Server 数据库中的所有表中删除所有默认约束、检查约束、唯一约束、主键和外键。我知道如何从 中获取所有约束名称sys.objects,但是如何填充ALTER TABLE部件?

sql-server constraint ddl

33
推荐指数
2
解决办法
6万
查看次数

如何实现只能在单行上设置的“默认”标志

例如,有一个类似这样的表:

create table foo(bar int identity, chk char(1) check (chk in('Y', 'N')));
Run Code Online (Sandbox Code Playgroud)

标志是否实现为 a char(1)、 abit或其他无关紧要。我只是希望能够强制执行它只能在单行上设置的约束。

constraint database-agnostic referential-integrity

32
推荐指数
10
解决办法
2万
查看次数

'ibfk' 在 MySQL 中代表什么?

如果我在 phpmyadmin 中为表 'photos' 创建外键约束,我后来看到该约束名为 'photos_ibfk_1',下一个约束名为 'photos_ibfk_2',等等。从这里我收集到 [tablename]_ibfk_constraintIndex 是MySQL 中数据库约束的约定。这样对吗?IBFK 代表什么?

mysql innodb foreign-key constraint

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

什么是 WITH CHECK CHECK 约束?

我有一些自动生成的 T-SQL,这可能是有效的,但我不太明白。

ALTER TABLE [dbo].[MyTable]
WITH CHECK
CHECK CONSTRAINT [My_FORIEGN_KEY];
Run Code Online (Sandbox Code Playgroud)

我知道什么是外键约束,但什么是外键约束CHECK CHECK

sql-server constraint t-sql

31
推荐指数
1
解决办法
4万
查看次数

如何在 SQL 中强制执行一次写入然后只读数据库表?

甚至有可能吗?

我的用例是一个分类帐表,要求一旦创建记录,它应该是只读的,即没有人能够编辑或删除它。这仅适用于分类帐表和与其直接相关的表 - 同一架构中还有其他表将正常更新/删除。

我的理解是,出于数据完整性的目的,应该在数据库层应用这些类型的约束,但我找不到一种干净的、广泛接受的方法 - 这是一个我最好这样做的用例吗在应用层?

理想的方法是在普通 SQL 中执行此操作,以便不知道使用什么数据库平台,因为这可能会发生变化,但我意识到这可能要求太多,所以如果它有要依赖于平台,最好使用一些 MySQL。

谢谢!

mysql constraint

30
推荐指数
3
解决办法
6673
查看次数

在数据库中强制执行“至少一个”或“恰好一个”的约束

假设我们有用户,每个用户可以有多个电子邮件地址

CREATE TABLE emails (
    user_id integer,
    email_address text,
    is_active boolean
)
Run Code Online (Sandbox Code Playgroud)

一些示例行

user_id | email_address | is_active
1       | foo@bar.com   | t
1       | baz@bar.com   | f
1       | bar@foo.com   | f
2       | ccc@ddd.com   | t
Run Code Online (Sandbox Code Playgroud)

我想强制执行一个约束,即每个用户都只有一个活动地址。我怎样才能在 Postgres 中做到这一点?我可以这样做:

CREATE UNIQUE INDEX "user_email" ON emails(user_id) WHERE is_active=true;
Run Code Online (Sandbox Code Playgroud)

这可以防止用户拥有多个活动地址,但我相信不会防止他们的所有地址都设置为 false。

如果可能的话,我更愿意避免使用触发器或 pl/pgsql 脚本,因为我们目前没有这些脚本,而且设置起来会很困难。但我很感激知道“唯一的方法是使用触发器或 pl/pgsql”,如果是这样的话。

postgresql database-design constraint referential-integrity ddl

28
推荐指数
3
解决办法
8683
查看次数

自定义唯一约束,仅当一列具有特定值时强制执行

是否可以具有如下自定义唯一约束?假设我有两个 colssubsettype,两个字符串(尽管数据类型可能无关紧要)。

如果type是“真”,那么我希望的组合type,并subset是唯一的。否则,没有约束。我在 Debian 上使用 PostgreSQL 8.4。

postgresql index database-design constraint unique-constraint

25
推荐指数
2
解决办法
8732
查看次数

检查约束不起作用?

我有下表。

create table test (
   id smallint unsigned AUTO_INCREMENT,
   age tinyint not null,
   primary key(id),
   check (age<20)
);
Run Code Online (Sandbox Code Playgroud)

问题是CHECK约束不适用于年龄列。例如,当我为年龄字段插入 222 时,MySQL 接受它。

mysql constraint

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

在使用 pg_restore.exe 之前禁用约束

当我尝试pg_restore.exe从数据库执行转储文件时,它抛出了许多错误,都是一样的:

ERROR: insert or update on table "someTable" violates foreign key constraint "aConstraintName"

这显然是因为我在从转储文件中恢复它之前已经清空了数据库(这个文件来自生产数据库)......当然,如果一个引用的表是空的,那么没有外键约束就可以了...

有没有办法禁用所有表的约束和所有外键,在我调用之前pg_restore.exe,然后重新启用约束和外键。

在 SO 中,我发现了一些有趣的事情:将约束检查推迟到提交时间。但我不认为我可以在推迟约束后pg_restore.exe从内部调用psql.exe

还有这个帖子,可以追溯到 10 年前,建议删除然后重新添加约束。或者将 pg_class reltriggers 的值更改为 0 并且这对于约束也是可能的......但我担心这比良好的实践更像是黑客攻击......

您有什么建议,在这种情况下的最佳做法是什么?pg_dump.exe -clean标志一起使用会创建一个转储,在还原数据库时绕过约束检查吗?

postgresql foreign-key constraint restore

22
推荐指数
1
解决办法
2万
查看次数

约束 - 一个布尔行为真,所有其他行为假

我有一个专栏: standard BOOLEAN NOT NULL

我想强制执行一行 True,而所有其他行都是 False。根据此约束,没有 FK 或其他任何东西。我知道我可以用 plpgsql 完成它,但这似乎是一个大锤。我更喜欢 a CHECKorUNIQUE约束之类的东西。越简单越好。

一行必须为 True,它们不能全部为 False(因此插入的第一行必须为 True)。

该行将需要更新,这意味着我必须等待检查约束,直到更新完成,因为所有行可能先设置为 False,然后再将一行设置为 True。

products.tax_rate_id和之间有一个 FK tax_rate.id,但它与默认或标准税率无关,用户可选择以轻松创建新产品。

PostgreSQL 9.5 如果重要的话。

背景

表是税率。其中一种税率是默认值(standard因为默认值是 Postgres 命令)。添加新产品时,标准税率适用于该产品。如果没有standard,则数据库必须进行猜测或进行各种不需要的检查。我想,简单的解决方案是确保有一个standard.

上面的“默认”是指表示层(UI)。用户可以选择更改默认税率。我要么需要添加额外的检查以确保 GUI/用户不会尝试将 tax_rate_id 设置为 NULL,或者只是设置默认税率。

postgresql constraint referential-integrity postgresql-9.5

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