我需要知道的是如何在我的桌子上放弃检查和主键约束。
这是我的表架构。
create table time_slot
(time_slot_id varchar(4),
day varchar(1),
start_hr numeric(2) check (start_hr >= 0 and start_hr < 24),
start_min numeric(2) check (start_min >= 0 and start_min < 60),
end_hr numeric(2) check (end_hr >= 0 and end_hr < 24),
end_min numeric(2) check (end_min >= 0 and end_min < 60),
primary key (time_slot_id, day, start_hr, start_min)
);
答案 0 :(得分:2)
您显示的命令适用于Oracle:
create table time_slot
(time_slot_id varchar(4),
day varchar(1),
start_hr numeric(2) check (start_hr >= 0 and start_hr < 24),
start_min numeric(2) check (start_min >= 0 and start_min < 60),
end_hr numeric(2) check (end_hr >= 0 and end_hr < 24),
end_min numeric(2) check (end_min >= 0 and end_min < 60),
primary key (time_slot_id, day, start_hr, start_min)
);
Table TIME_SLOT created.
select constraint_name, constraint_type, search_condition
from user_constraints where table_name = 'TIME_SLOT';
CONSTRAINT_NAME C SEARCH_CONDITION
------------------------------ - --------------------------------------------------------------------------------
SYS_C00117031 C start_hr >= 0 and start_hr < 24
SYS_C00117032 C start_min >= 0 and start_min < 60
SYS_C00117033 C end_hr >= 0 and end_hr < 24
SYS_C00117034 C end_min >= 0 and end_min < 60
SYS_C00117035 P
alter table time_slot drop constraint SYS_C00117031;
Table TIME_SLOT altered.
alter table time_slot drop primary key;
Table TIME_SLOT altered.
所以要么你使用旧的约束名称(并且已经删除并重新创建了表);或者有不同的表格实例(在不同的模式中),你在dba_constraints
中看到了错误的实例;或者你试图在没有前缀的情况下修改另一个模式中的表。或者,可能是我没有想过的东西,可以通过分享你得到的错误来揭示......(例如没有权限放弃约束,正如@mathguy指出的那样 - 这可能是一件好事)< / p>
在稍后的评论中,您说您正在获得约束违规,这似乎与您之前提到的插入有关,而不是尝试放弃约束:
ORA-02290:check constraint(SYS.SYS._C0010701) violated
首先,除非您编辑它以隐藏您的真实模式名称(您可能拥有 - 至少还有一段额外的时间),这表明您正在创建和修改SYS模式中的内容。如果您正在停止操作,请为您自己创建一个新的用户/架构,并且只能在其中工作。你不应该在内置模式中搞乱。
其次,如果是来自插入,那是因为你试图将start_hr
设置为30,这正是要防止的约束。你不是通过不提供列表来帮助自己;如果你这样做,那就更明显了:
insert into time_slot (time_slot_id, day, start_hr, start_min, end_hr, end_min)
values ('M', 'S', 30, 0, 15, 35);
所以你试图让开始时间为30:00,结束时间为15:35,这是没有意义的。
删除约束不是这里的答案,您需要提供有效数据。但如果您确实想要,则会在错误消息中提供相关的约束名称 - 您可以从dba / user_constraints中查看它是哪一个,如果您想删除它,则可以执行以下操作:
alter table time_slot drop constraint SYS_C0010701;
但我认为这是解决你真正问题的错误方法。
您可能还想考虑使用间隔或日期(带有固定的虚拟日期部分)而不是单独的小时和日期列;验证将自动进行。
答案 1 :(得分:-2)
ALTER TABLE time_slot DROP PRIMARY KEY;
ALTER TABLE time_slot DROP CHECK CHECK_NAME;