【问题标题】:Oracle creating composite primary key with constantsOracle 用常量创建复合主键
【发布时间】:2020-06-29 16:11:53
【问题描述】:

使用 oracle,我如何创建带有约束检查的复合 PRIMARY 键。

以下是想要完成的示例

create table T ( 
  n int,
dt DATE,
constraint t_pk primary key (n,
(dt=trunc(dt, 'dd')));

【问题讨论】:

  • 您只想允许时间设置为午夜的日期?或者您想留出任何时间,但每天只允许一次?

标签: oracle composite-primary-key


【解决方案1】:

如果您只想允许时间设置为午夜的日期,请使用单独的检查约束:

create table T ( 
  n int,
  dt DATE,
  constraint t_chk check (dt=trunc(dt, 'dd')),
  constraint t_pk primary key (n, dt)
);

如果您想允许非午夜时间但每天只允许一个时间,那么您可以使用虚拟列,正如@gsalem 还建议的那样:

create table T ( 
  n int,
  dt DATE,
  dd DATE generated always as (trunc(dt)),
  constraint t_pk primary key (n, dd)
 );

db<>fiddle 显示两者;注意两个 select 语句输出的不同时间。

【讨论】:

  • 谢谢,完美。我想要第一个场景
  • @AlexPoole 再来一杯咖啡 ;)
【解决方案2】:

尽管您声明的要求是正确的,但您可以使用虚拟列来做到这一点:

    create table T ( 
  n int,
dt DATE check (dt=trunc(dt,'dd')),
dt1 generated always as (trunc(dt,'dd')),
constraint t_pk primary key (n,
dt1));

【讨论】:

  • dt1 不是必需的。它将始终与 dt 相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 2012-04-16
  • 1970-01-01
相关资源
最近更新 更多