【问题标题】:Constraining a database table so only one row can have a particular value in a column约束数据库表,使一列中只有一行可以具有特定值
【发布时间】:2015-07-17 11:10:56
【问题描述】:

我是 SQL 的新手,当我尝试遵循 here 帖子中的建议以在我的专栏中只执行一个“是”时,我试图找出一条错误消息。

DROP TABLE team  CASCADE CONSTRAINTS PURGE;
create table team (
  name varchar2(4) NOT NULL UNIQUE,
  isTeamLead char(3) 
    check (isTeamLead in ('Yes')));

create unique index only_one_yes on team(isTeamLead)
(case when col='YES' then 'YES' end);

报错如下:

Error report -
SQL Error: ORA-02158: invalid CREATE INDEX option
02158. 00000 -  "invalid CREATE INDEX option"
*Cause:    An option other than COMPRESS, NOCOMPRESS, PCTFREE, INITRANS,
           MAXTRANS, STORAGE, TABLESPACE, PARALLEL, NOPARALLEL, RECOVERABLE,
           UNRECOVERABLE, LOGGING, NOLOGGING, LOCAL, or GLOBAL was specified.
*Action:   Choose one of the valid CREATE INDEX options.

有什么想法吗?

运行 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0

【问题讨论】:

  • CASE 语句中的 col 是什么? Oracle 在创建索引时没有识别并报告错误。 create unique index only_one_yes on team(isTeamLead); 可以正常工作。

标签: sql oracle11g unique-index


【解决方案1】:

删除create index 语句的case 部分。这执行OK:

create table team (
  name varchar2(4) NOT NULL UNIQUE,
  isTeamLead char(3) check (isTeamLead in ('Yes'))
);

create unique index only_one_yes on team(isTeamLead);

insert into team values ('x', 'Yes');
insert into team values ('y', null);

SQLFiddle

【讨论】:

  • 好的。如果我在表中包含项目列并希望每个项目有一个团队负责人,那么使用索引似乎不起作用。您可以在 SQLFiddle 上测试code here。我想知道我是否每个项目只能有一个Yes,但尽可能多的null。谢谢。
  • 看看this 是否有帮助。当提供的插入值为空时,您可以向表中添加触发器以使用行号或 id 列等创建唯一的“非‘是’”值。
猜你喜欢
  • 2010-09-15
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
  • 2021-09-30
  • 1970-01-01
相关资源
最近更新 更多