我有一个firebird数据库架构,它由各种CREATE TABLE
脚本设置。这些脚本已提交到源控制系统(请参阅Scott Allen's站点)。
现在我想创建一个新脚本,我希望我的数据库删除特定表中一列的NOT NULL
约束:
ALTER TABLE myTable DROP CONSTRAINT c
可以通过查询系统表来获取约束的名称(例如INTEG_219):
SELECT rc.rdb$constraint_name
FROM rdb$relation_constraints rc
join rdb$check_constraints cc
on rc.rdb$constraint_name = cc.rdb$constraint_name
WHERE rc.rdb$constraint_type = 'NOT NULL'
and rc.rdb$relation_name = 'MYTABLE'
and cc.rdb$trigger_name = 'ACOLUMN'
这些语句可以组合成一个ALTER
命令吗?
答案 0 :(得分:6)
我建议你看看EXECUTE STATEMENT。
中execute BLOCK
as declare variable stmt VARCHAR(2500) = 'SELECT ''ALTER TABLE MYTABLE myTable DROP CONSTRAINT ''|| rc.rdb$constraint_name||'';'' FROM rdb$relation_constraints rc
join rdb$check_constraints cc
on rc.rdb$constraint_name = cc.rdb$constraint_name WHERE rc.rdb$constraint_type = ''NOT NULL''
and rc.rdb$relation_name = ''MYTABLE''
and cc.rdb$trigger_name = ''ACOLUMN''';
begin
execute STATEMENT stmt;
end;
答案 1 :(得分:0)
这个答案是基于Hughes Van Landeghem的回答和Norbert对这个答案的回答,所以请不要投票赞成:)
execute BLOCK
as
declare variable stmt VARCHAR(2500);
declare variable cname varchar(255);
begin
SELECT rc.rdb$constraint_name
FROM rdb$relation_constraints rc
join rdb$check_constraints cc
on rc.rdb$constraint_name = cc.rdb$constraint_name
WHERE rc.rdb$constraint_type = 'NOT NULL'
and rc.rdb$relation_name = 'MYTABLE'
and cc.rdb$trigger_name = 'ACOLUMN'
INTO :cname;
stmt = 'alter table myTable drop constraint ' || cname;
execute STATEMENT stmt;
end;
我也在使用Firebird 2.5并且无法获得Hughes Van Landeghem的原始答案。我收到的错误是找不到错误代码335544928的消息,我认为它与嵌入式选择有关。