我有一个“评论”表,可以模拟某个主题的对话,如下所示:
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")
根据CREATE INDEX文档:
最多可以将 16 列组合成一个复合索引键。
我们有一个包含 ~18 列的表格,需要形成一个独特的组合。此表对性能不敏感——我们很少更新值/插入记录。我们只需要确保我们避免重复我们的记录......并认为我们可以强加一个简单的唯一性约束。
有任何想法吗?如果有更好的方法,我愿意完全避免使用唯一索引/约束。
我有一个用户表,它有两列一个名为 UserID 的主键和另一个名为 UserName 的列。
它们都是独一无二的,但出于某些原因,我决定使用 UserName 作为其他表中的参考。因此,例如订单表通过 UserName 而不是 userid 引用了用户。
我想在引用 UserName 和 Users 表的所有表之间创建关系,以便获得 SQL Server 的级联更新/删除功能。
但是 SQL Server 不允许我在非主键列上创建关系。有什么方法可以在不更改用户表的情况下获得级联更新/删除功能,以便 UserName 是主键而不是 UserID?
直观地,将选项 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。
复式记账是
一组用于在财务会计系统中记录财务信息的规则,其中每个交易或事件至少更改两个不同的名义分类账帐户。
一个账户可以“借”也可以“贷”,所有贷记的总和必须等于所有借记的总和。
你将如何在 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) 我有一块在 PostgreSQLSQL中创建了TABLE一个SELECT语句;我想向表中添加约束,例如,一列不能是null.
我在 Postgres 文档中找不到对此有效的 SQL,因此似乎不可能。
实现这种功能的最佳方法是什么?如果违反约束,我希望表的创建失败。
我无法预先创建带有约束的表,因为某些列可能存在一些变化,因为它们是动态过程的结果。
我需要检查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”中。
这怎么会发生?
有一个名为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
出于日志目的,在我设计的一个表中,我想存储用户登录时的IP信息。
当用户登录时,应存储 IPv4、IPv6 或两个 IP 地址。但我想设置一个不能为 NULL 的约束。
是否可以在带有约束的标准 SQL 中执行此操作,还是应该在 PostgreSQL 或业务层中使用 PL/pgSQL 执行此操作?
架构:
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。
问题:如何添加第二个约束?用例:我们有一个无限期的规则。我想切换到新规则,该规则应从下个月开始。在这种情况下,我想将当前规则结束期设置为当月月底,并在单个操作中添加新规则。
更新:将来我想添加以下行为:
换句话说,所有先前的约束都应仅应用于 user_id 为 NULL 的行。如何做到这一点?
PostgreSQL …
constraint ×10
postgresql ×7
foreign-key ×4
sql-server ×3
alter-table ×1
ddl ×1
interval ×1
transaction ×1