Estou criando uma tabela no Postgresql-11, e preciso criar uma chave primária para ela ao mesmo tempo, para evitar que dados duplicados sejam inseridos antes da criação do PK, então quero que essas duas operações sejam realizadas dentro de uma mesma transação.
Eu sei que isso pode dar certo:
CREATE TABLE IF NOT EXISTS my_tab (
my_key INT8 NOT NULL,
PRIMARY KEY ( my_key ) );
Mas também quero definir um nome para este PK, em vez do nome padrão, para facilitar a manutenção.
Se eu fizer da seguinte maneira:
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 );
Estou preocupado que essas duas declarações sejam feitas em duas transações diferentes. ou seja, existe alguma probabilidade de alguns dados duplicados serem inseridos antes da criação da PK?
E ainda mais, que tal se a mesa já existisse? Se a tabe já existir, a segunda instrução falhará?
O SQL acima é executado em meu programa C++, que é um serviço daemon de longa data. Não quero que ele trave sem a participação humana por causa de uma falha de SQL.
Como conseguir isso? Obrigado!
Você pode especificar um nome de restrição com a "sintaxe de restrição de coluna" e a "sintaxe de restrição de tabela" em
CREATE TABLE
:ou
Observação lateral: eu evitaria
CREATE TABLE IF NOT EXISTS
. Você nunca pode ter certeza do que obteve depois que a declaração foi bem-sucedida. Pode ter havido uma tabela com esse nome, mas com colunas/proprietário/permissões/...