sql - 有没有办法根据其中一列值添加表约束?

标签 sql oracle ddl

更具体地说。我有这张事件表

create table event(
 id NUMERIC(3) PRIMARY KEY,
 date DATE
)

我需要添加另一列(已取消),该列仅接受 01 值。这里的问题是,该列还需要一个约束,不允许取消 1.01.2021 之前的事件(这意味着 cancel 值不能为 1(true))例如,日期为 2020 年 9 月 15 日的事件)。有什么提示吗?这是我得到的“最接近的”,但我知道这是错误的,通过在其他线程上搜索,我了解到约束内不允许查询。 我尝试过的(我知道这是不正确的,因为它不允许添加日期在 2021 年 1 月 1 日之前的条目):

ALTER TABLE event
ADD canceled number(1) DEFAULT 0 CHECK(canceled in (0,1));

ALTER TABLE event
ADD CONSTRAINT C_event_canceled CHECK(date >= to_date('01/01/2021', 'dd/mm/yyyy'));

忘了说,我不能使用任何函数或相关的东西,只是简单的查询。

最佳答案

doesn't allow events before 1.01.2021 to be canceled

Mureinik 的回答是正确的。但是,这个版本更接近您表达要检查的内容的方式:

check (not (cancelled = 1 and date < date '2021-01-01') )

请注意,Oracle 使用date 作为日期常量的前缀。此外,date 是一种数据类型——这使得它成为列名的一个非常糟糕的选择。我建议:

check (not (cancelled = 1 and event_date < date '2021-01-01') )

关于sql - 有没有办法根据其中一列值添加表约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63981896/

相关文章:

sql - Oracle SQL - 检查约束

php - 主机名可以注入(inject)SQL吗?

php - 准备语句的语法错误

mysql - 从 Oracle 查询的内容生成 mysql import 语句时出现问题

oracle - 将十六进制转换为字符串

arrays - 如何在 BigQuery 中声明列表/数组/结构类型变量

mysql - 可快速搜索同义词

php - 在不求助于 mysql_insert_id() 的情况下,在单个查询中将 SQL 关系插入到 2 个表

javascript - 在 Oracle Apex 4.2 中通过 Jquery 传递选择列表的值

postgresql - 使用多个 WHEN 条件触发