标签: referential-integrity

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

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

postgresql foreign-key constraint referential-integrity ddl

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

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

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

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万
查看次数

数组成员的外键约束?

假设我有一个包含工作角色的表:

CREATE TABLE roles
(
  "role" character varying(80) NOT NULL,
  CONSTRAINT "role" PRIMARY KEY (role)
);
Run Code Online (Sandbox Code Playgroud)

假设我还有一个表、用户,并且每一行(一个特定用户)可以有任意数量的工作角色:

CREATE TABLE users
(
  username character varying(12) NOT NULL,
  roles character varying(80)[] NOT NULL,
  CONSTRAINT username PRIMARY KEY (username)
);
Run Code Online (Sandbox Code Playgroud)

我应该确保每个成员都users.roles[]存在于roles.role 中。在我看来,我想要的是对每个成员的外键约束users.roles[],如果引用了roles.role。

这对于 postgres 似乎是不可能的。我是不是看错了?处理此问题的建议“正确”方法是什么?

postgresql referential-integrity array

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

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

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

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
查看次数

是否有 DBMS 允许引用视图(而不仅仅是基表)的外键?

受到 Django 建模问题的启发:Database Modeling with multiple many-to-many Relations in Django。db-design 是这样的:

CREATE TABLE Book
( BookID INT NOT NULL
, BookTitle VARCHAR(200) NOT NULL
, PRIMARY KEY (BookID)
) ;

CREATE TABLE Tag
( TagID INT NOT NULL
, TagName VARCHAR(50) NOT NULL
, PRIMARY KEY (TagID)
) ;

CREATE TABLE BookTag
( BookID INT NOT NULL
, TagID INT NOT NULL
, PRIMARY KEY (BookID, TagID)
, FOREIGN KEY (BookID)  REFERENCES Book (BookID)
, FOREIGN KEY (TagID) …
Run Code Online (Sandbox Code Playgroud)

foreign-key database-design referential-integrity

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

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

我有一个专栏: 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万
查看次数

多对多弱实体

我有一个没有被另一个实体定义就不能存在的实体,我希望这个实体参与多对多关系。

例子:一个艺人有一张专辑(没有艺人就不能存在专辑),专辑也有很多曲目,但同一曲目可以存在于多个专辑中。

所以我们在专辑和曲目之间有一个多对多的关系。

如果专辑是弱实体,则其主键是引用艺术家的外键,因此它不能是表示多对多关系的另一个表的外键。

问题是:SQL中是否可以有这种关系,如果可以,我该如何表达?

foreign-key database-design referential-integrity

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

强制约束“两个表”

我在 SQL 中对电气原理图建模时遇到了一些麻烦。我想捕获的结构是

  part ??????????? pin
   ?                ?
part_inst ?????? pin_inst
Run Code Online (Sandbox Code Playgroud)

其中“inst”是“instance”的缩写。

例如,我可能part将 LM358 运算放大器pin用作 1OUT、1IN-、1IN+、GND、2IN+、2IN-、2OUT 和 V CC。然后我可能会将这部分放在原理图上,创建 apart_inst和 8 pin_insts。

忽略数据字段,我对模式的最初尝试是

create table parts (
    part_id bigserial primary key
);
create table pins (
    pin_id bigserial primary key,
    part_id bigint not null references parts
);
create table part_insts (
    part_inst_id bigserial primary key,
    part_id bigint not null references parts
);
create table pin_insts (
    pin_inst_id bigserial primary key,
    part_inst_id bigint …
Run Code Online (Sandbox Code Playgroud)

postgresql foreign-key database-design referential-integrity polymorphic-associations

13
推荐指数
1
解决办法
5105
查看次数

级联主键更新所有引用外键

是否可以通过在引用它的所有外键之间级联更新来更新主键列值?

# EDIT 1: 当我运行 followinq 查询

select * from sys.foreign_keys where referenced_object_id=OBJECT_ID('myTable') 
Run Code Online (Sandbox Code Playgroud)

,我看到 update_referential_action 设置为 0。因此更新我的主键列后没有采取任何操作。如何更新外键以使其ON CASCADE UPDATE

# EDIT 2:
为了编写或删除架构中所有外键的脚本,请运行以下脚本(取自此处

DECLARE @schema_name sysname;

DECLARE @table_name sysname;

DECLARE @constraint_name sysname;

DECLARE @constraint_object_id int;

DECLARE @referenced_object_name sysname;

DECLARE @is_disabled bit;

DECLARE @is_not_for_replication bit;

DECLARE @is_not_trusted bit;

DECLARE @delete_referential_action tinyint;

DECLARE @update_referential_action tinyint;

DECLARE @tsql nvarchar(4000);

DECLARE @tsql2 nvarchar(4000);

DECLARE @fkCol sysname;

DECLARE @pkCol sysname;

DECLARE @col1 bit;

DECLARE @action char(6);  

DECLARE @referenced_schema_name sysname;



DECLARE FKcursor …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 foreign-key sql-server referential-integrity update

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

这个“映射”表是否需要一个单独的 Id 列?

我有一个表Producers和一个表Products,两者都是以下形式:

  • Id - int, 主键
  • Name - nvarchar

Producer 可以携带多个产品,因此我将创建一个名为的表ProducerDetails,该表将具有:

  • ProducerId - int, 外键 Producers.Id
  • ProductId - int, 外键 Products.Id

然后我开始质疑自己,所以我想我会问专家。Id在我的ProducerDetails表中有一个额外的(int,主键)列会更好的数据库设计吗?或者这是不必要的?

如果这有什么不同,我正在使用 SQL-Server 2008 R2。

编辑- 我相信这些表之间的关系是多对多的,抱歉我没有说清楚。一个生产者可以携带多种类型的产品,同一产品可以由多个不同的生产者生产。

如果这个问题过于简单,我深表歉意,参照完整性/数据库设计不是我的强项(尽管我正在努力改进)。

database-design sql-server referential-integrity

11
推荐指数
2
解决办法
7475
查看次数