在事务中封装 Drop 和 Add 约束
encapsulating a Drop and Add constraint in a transaction
我有一个简单的删除并添加一个封装在事务中的约束,如下所示:
begin;
alter table movies drop constraint actor_check;
alter table movies add constraint actor_check check ( "actor" not like '%Harpo Marx%'
and "actor" not like '%Chico Marx%'
and "actor" not like '%Groucho Marx%'
and "actor" not like '%Zeppo Marx%');
end;
但是交易出错:
BEGIN
Time: 70ms
ALTER TABLE
Time: 364ms
DELETE 0
Time: 1.283s
ERROR: relation "movies" (61): duplicate constraint name: "actor_check"
SQLSTATE: 42710
ERROR: relation "movies" (61): duplicate constraint name: "actor_check"
SQLSTATE: 42710
Failed running "sql"
请指教
cockroach 目前不支持这种原子约束更改。为什么不这样做的原因相对复杂。 Cockroach 尝试以在线方式执行所有模式更改,从不锁定 table 进行写入。为实现这一点,数据库将模式更改分解为多个阶段,其中大部分在事务提交后异步执行。这给相互依赖的各种模式更改带来了问题。我们正在积极努力解决这个问题,尽管这是一个长期的项目。您可以在 this RFC.
中阅读更多内容
目前,您能做的最好的事情就是删除约束并添加一个具有不同名称的新约束,然后在后续事务中将其重命名为旧名称。
我有一个简单的删除并添加一个封装在事务中的约束,如下所示:
begin;
alter table movies drop constraint actor_check;
alter table movies add constraint actor_check check ( "actor" not like '%Harpo Marx%'
and "actor" not like '%Chico Marx%'
and "actor" not like '%Groucho Marx%'
and "actor" not like '%Zeppo Marx%');
end;
但是交易出错:
BEGIN
Time: 70ms
ALTER TABLE
Time: 364ms
DELETE 0
Time: 1.283s
ERROR: relation "movies" (61): duplicate constraint name: "actor_check"
SQLSTATE: 42710
ERROR: relation "movies" (61): duplicate constraint name: "actor_check"
SQLSTATE: 42710
Failed running "sql"
请指教
cockroach 目前不支持这种原子约束更改。为什么不这样做的原因相对复杂。 Cockroach 尝试以在线方式执行所有模式更改,从不锁定 table 进行写入。为实现这一点,数据库将模式更改分解为多个阶段,其中大部分在事务提交后异步执行。这给相互依赖的各种模式更改带来了问题。我们正在积极努力解决这个问题,尽管这是一个长期的项目。您可以在 this RFC.
中阅读更多内容目前,您能做的最好的事情就是删除约束并添加一个具有不同名称的新约束,然后在后续事务中将其重命名为旧名称。