标签: constraint

非唯一的多列外键

我有一个“评论”表,可以模拟某个主题的对话,如下所示:

id serial  
topic_id integer  
parent_comment_id integer
body text
Run Code Online (Sandbox Code Playgroud)

因此,每条评论都有对其主题的引用,并最终引用其父评论(如果它不是该主题的第一条评论)。
我想添加一个约束,以防止添加主题/父项不匹配的行(例如,通过引用没有所需评论的主题,或者相反地引用错误主题的评论)。
这可能吗?是否需要触发器?

(为了记录,我试过

ALTER TABLE comments ADD FOREIGN KEY (parent_comment_id, topic_id)
                 REFERENCES comments (id, topic_id)
Run Code Online (Sandbox Code Playgroud)

但它抱怨there is no unique constraint matching given keys for referenced table "comments"

postgresql foreign-key constraint

8
推荐指数
1
解决办法
8677
查看次数

以任何方式绕过唯一索引 16 列最大值

根据CREATE INDEX文档:

最多可以将 16 列组合成一个复合索引键。

我们有一个包含 ~18 列的表格,需要形成一个独特的组合。此表性能敏感——我们很少更新值/插入记录。我们只需要确保我们避免重复我们的记录......并认为我们可以强加一个简单的唯一性约束。

有任何想法吗?如果有更好的方法,我愿意完全避免使用唯一索引/约束。

sql-server-2008 database-design sql-server constraint

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

如何在 SQL Server 中创建与非主键的关系?

我有一个用户表,它有两列一个名为 UserID 的主键和另一个名为 UserName 的列。

  • 用户 ID (int) PK
  • 用户名 (varchar(256)

它们都是独一无二的,但出于某些原因,我决定使用 UserName 作为其他表中的参考。因此,例如订单表通过 UserName 而不是 userid 引用了用户。

  • 订单号
  • 用户名

我想在引用 UserName 和 Users 表的所有表之间创建关系,以便获得 SQL Server 的级联更新/删除功能。

但是 SQL Server 不允许我在非主键列上创建关系。有什么方法可以在不更改用户表的情况下获得级联更新/删除功能,以便 UserName 是主键而不是 UserID?

foreign-key sql-server constraint

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

FK ON UPDATE CASCADE 会起作用吗?

直观地,将选项 ON UPDATE CASCADE 添加到外键约束将具有使用键的更新值更新所有引用列的效果。那真的有用吗?

从手册中提取的示例:

CREATE TABLE products (
    product_no integer PRIMARY KEY,
    name text,
    price numeric
);

CREATE TABLE orders (
    order_id integer PRIMARY KEY,
    shipping_address text,
    ...
);

CREATE TABLE order_items (
    product_no integer REFERENCES products ON DELETE RESTRICT,
    ## HERE'S THE LINE THAT I MODIFIED FROM THE MANUAL, IT USED TO SAY 'ON DELETE CASCADE'
    order_id integer REFERENCES orders ON UPDATE CASCADE,
    quantity integer,
    PRIMARY KEY (product_no, order_id)
);
Run Code Online (Sandbox Code Playgroud)

我正在使用 Postgres 9.1。

postgresql foreign-key constraint

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

交易、参考以及如何执行复式记账?(PG)

复式记账是

一组用于在财务会计系统中记录财务信息的规则,其中每个交易或事件至少更改两个不同的名义分类账帐户。

一个账户可以“借”也可以“贷”,所有贷记的总和必须等于所有借记的总和。

你将如何在 Postgres 数据库中实现它?指定以下 DDL:

CREATE TABLE accounts(
    account_id serial NOT NULL PRIMARY KEY,
    account_name varchar(64) NOT NULL
);


CREATE TABLE transactions(
    transaction_id serial NOT NULL PRIMARY KEY,
    transaction_date date NOT NULL
);


CREATE TABLE transactions_details(
    id serial8 NOT NULL PRIMARY KEY,
    transaction_id integer NOT NULL 
        REFERENCES transactions (transaction_id)
        ON UPDATE CASCADE
        ON DELETE CASCADE
        DEFERRABLE INITIALLY DEFERRED,
    account_id integer NOT NULL
        REFERENCES accounts (account_id)
        ON UPDATE CASCADE
        ON DELETE RESTRICT
        NOT DEFERRABLE INITIALLY IMMEDIATE,
    amount decimal(19,6) NOT …
Run Code Online (Sandbox Code Playgroud)

postgresql constraint transaction

8
推荐指数
1
解决办法
4470
查看次数

CREATE as SELECT with CONSTRAINT?

我有一块在 PostgreSQLSQL中创建了TABLE一个SELECT语句;我想向表中添加约束,例如,一列不能是null.

我在 Postgres 文档中找不到对此有效的 SQL,因此似乎不可能。

实现这种功能的最佳方法是什么?如果违反约束,我希望表的创建失败。

我无法预先创建带有约束的表,因为某些列可能存在一些变化,因为它们是动态过程的结果。

postgresql database-design constraint

8
推荐指数
2
解决办法
2765
查看次数

ALTER TABLE 语句与 CHECK 约束冲突

我需要检查datecom小于datelivr

create table Commande
(
Numcom int identity primary key,
Datecom date,
Datelivr date,
Codecli int foreign key references clients (Codecli) 
)

alter table Commande 
    add constraint date_check check(datediff(day,Datecom,Datelivr) > 0)
Run Code Online (Sandbox Code Playgroud)

但我收到错误消息:

ALTER TABLE 语句与 CHECK 约束“date_check”冲突。冲突发生在数据库“tp4”,表“dbo.Commande”中。

这怎么会发生?

sql-server constraint alter-table ddl sql-server-2012

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

外键有额外的约束?

有一个名为Item(id, name, cost)and的表Orders(id, bill_id, item_id, units),用于跟踪所下的订单,其中相同的bill_id表示它属于单个订单。

如果需要在Order表中添加item_id,如何在 DB 中施加一个额外的约束,表明Item应该是“可用的”(在那个时间点)?在这种情况下,项目被手动确定为“可用”并且不能从数据库中的其他字段派生。

一种模式设计(我更喜欢)是添加一个类型列,该列将具有“可用”和“不可用”字段。但是如何检查外键约束item_id不仅应该是Item表中的主键,其类型也应该是“可用”?

这个使用检查约束的堆栈溢出答案似乎很接近,但这是唯一的方法吗?我觉得这对于 RDBMS 来说是一件小事,或者这不是规范化的数据?

其他架构设计(我不喜欢)是有一个表称为“菜单”,这可能具有唯一项目可用。问题是这张桌子本质上是非常动态的,它会根据物品的可用性不断变化。而且,我只是根据项目的状态从项目中创建一个子集表,这似乎不是一个好主意。

以编程方式执行此操作很容易;但是,我如何在 RDBMS 中实现这一点?我喜欢数据库足够智能来处理这个的想法。

postgresql foreign-key database-design constraint check-constraints

7
推荐指数
1
解决办法
1186
查看次数

是否可以在 PostgreSQL 中设置复合 NOT NULL 约束

出于日志目的,在我设计的一个表中,我想存储用户登录时的IP信息。

当用户登录时,应存储 IPv4、IPv6 或两个 IP 地址。但我想设置一个不能为 NULL 的约束。

是否可以在带有约束的标准 SQL 中执行此操作,还是应该在 PostgreSQL 或业务层中使用 PL/pgSQL 执行此操作?

postgresql constraint

7
推荐指数
2
解决办法
4074
查看次数

如何检查 PostgreSQL 中是否没有时间间隔?

架构

CREATE TABLE "expenses_commissionrule" (
    "id" serial NOT NULL PRIMARY KEY, 
    "country" varchar(2) NOT NULL, 
    "created" timestamp with time zone NOT NULL, 
    "modified" timestamp with time zone NOT NULL, 
    "activity" tsrange NOT NULL
); 
Run Code Online (Sandbox Code Playgroud)

说明

我想创建一个应用程序来管理佣金计算。每个规则都有活动期。每个国家都有一套独立的规则。

约束

第一的。为避免歧义,这些活动期不应重叠。我做了以下约束:

ALTER TABLE expenses_commissionrule 
ADD CONSTRAINT non_overlapping_activity 
EXCLUDE USING GIST (country WITH =, activity WITH &&);
Run Code Online (Sandbox Code Playgroud)

第二。在任何时间点都应该只有一个佣金规则,因此表中的间隔之间不应存在间隙。换句话说,所有区间的总和应该是 -INF:+INF。

问题:如何添加第二个约束?用例:我们有一个无限期的规则。我想切换到新规则,该规则应从下个月开始。在这种情况下,我想将当前规则结束期设置为当月月底,并在单个操作中添加新规则。

更新:将来我想添加以下行为:

  1. 仅为特定用户指定规则的能力(通过可为空的外键“user_id”);
  2. 每个用户都可以为每个国家/地区制定自己的规则。如果用户没有规则——“全局”规则将用于佣金计算,所以它就像一个后备;
  3. 这些“用户”规则可以有任何活动时间段 - (-inf: inf) 和具体的时间间隔。它与“全局”规则不同——这里的差距是可以的。
  4. 由于“可能是”功能 - 额外的 varchar 字段,这将有一种情况,当可以应用特定规则以在计算过程中具有更大的灵活性时。这个“部分”规则也可能有不同的间隔,间隙是可以的。

换句话说,所有先前的约束都应仅应用于 user_id 为 NULL 的行。如何做到这一点?

PostgreSQL …

postgresql database-design constraint interval

7
推荐指数
1
解决办法
685
查看次数