我正在Postgresql-11中创建一个表,我需要同时为其创建一个主键,以防止在创建PK之前插入重复的数据,所以我希望这两个操作在同一个事务中完成。
我知道这可以得到它:
CREATE TABLE IF NOT EXISTS my_tab (
my_key INT8 NOT NULL,
PRIMARY KEY ( my_key ) );
但我还想为此 PK 设置一个名称,而不是默认名称,以便使维护工作变得容易。
如果我这样做:
CREATE TABLE IF NOT EXISTS my_tab ( my_key INT8 NOT NULL );
ALTER TABLE my_tab ADD CONSTRAINT custom_pk_name_my_tab PRIMARY KEY ( my_key );
我担心这两个语句将在两个不同的事务中完成。即在创建 PK 之前是否有可能插入一些重复的数据?
更进一步,如果该表已经存在怎么办?如果 tabe 已经存在,第二条语句会失败吗?
上面的SQL是在我的C++程序中执行的,这是一个长时间的守护服务。我不希望它因 SQL 故障而在无人参与的情况下崩溃。
如何获得?谢谢!
您可以使用“列约束语法”和“表约束语法”指定约束名称
CREATE TABLE
:或者
旁注:我会避免
CREATE TABLE IF NOT EXISTS
。你永远无法确定语句成功后你会得到什么。可能有一个具有该名称的表,但列/所有者/权限/...错误