1

我有一个简单的删除并添加一个封装在事务中的约束,如下所示:

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"

请指教

4

1 回答 1

2

cockroach 目前不支持这种原子约束更改。没有的原因是比较涉及的。Cockroach 尝试以在线方式执行所有模式更改,从不锁定表以进行写入。为此,数据库将模式更改分解为多个阶段,其中大部分在事务提交后异步执行。这给相互依赖的各种模式更改带来了问题。我们正在积极努力解决这个问题,尽管这是一个漫长的项目。您可以在此 RFC中阅读更多内容。

目前,您能做的最好的事情是删除约束并添加一个具有不同名称的新约束,然后在后续事务中将其重命名为旧名称。

于 2021-08-16T13:51:53.353 回答