Estou mudando do MySQL para o PostgreSQL e queria saber como posso fazer valores de incremento automático. Vi nos documentos do PostgreSQL um tipo de dados "serial", mas recebo erros de sintaxe ao usá-lo (na v8.0).
579
Estou mudando do MySQL para o PostgreSQL e queria saber como posso fazer valores de incremento automático. Vi nos documentos do PostgreSQL um tipo de dados "serial", mas recebo erros de sintaxe ao usá-lo (na v8.0).
Respostas:
Sim, SERIAL é a função equivalente.
SERIAL é apenas uma macro de tempo de criação de tabela em torno de seqüências. Você não pode alterar SERIAL em uma coluna existente.
fonte
"Table"
e"table"
, em seguida, deixá-lo sem aspas e canonizar-lo paratable
. A convenção é simplesmente nunca usar aspas na pág. Você pode, se quiser, usar nomes mistos de maiúsculas e minúsculas para a aparência, apenas não é necessário:CREATE TABLE fooBar ( .. ); SELECT * FROM fooBar;
funcionará da mesma formaSELECT * FROM foobar
.Você pode usar qualquer outro tipo de dados inteiro , como
smallint
.Exemplo:
Melhor usar seu próprio tipo de dados, em vez do tipo de dados seriais do usuário .
fonte
CREATE SEQUENCE
postgresql.org/docs/8.1/interactive/sql-createsequence.html ) . No entanto, não sei ao certo por que você mudou o proprietário.Se você deseja adicionar uma sequência ao id na tabela que já existe, você pode usar:
fonte
ALTER COLUMN user_id
?ERROR: syntax error at or near "DEFAULT"
Alguma sugestão?Embora pareça que sequências equivalem ao auto_increment do MySQL, existem algumas diferenças sutis, mas importantes:
1. Consultas com falha incrementam a sequência / série
A coluna serial é incrementada em consultas com falha. Isso leva à fragmentação das consultas com falha, não apenas às exclusões de linha. Por exemplo, execute as seguintes consultas no banco de dados PostgreSQL:
Você deve obter a seguinte saída:
Observe como o uid passa de 1 para 3 em vez de 1 para 2.
Isso ainda ocorre se você criar manualmente sua própria sequência com:
Se você deseja testar como o MySQL é diferente, execute o seguinte em um banco de dados MySQL:
Você deve obter o seguinte sem fracionamento :
2. A configuração manual do valor da coluna serial pode causar falhas em futuras consultas.
Isso foi apontado pelo @trev em uma resposta anterior.
Para simular isso manualmente, defina o uid como 4, que entrará em conflito mais tarde.
Dados da tabela:
Execute outra inserção:
Dados da tabela:
Agora, se você executar outra inserção:
Ele falhará com a seguinte mensagem de erro:
Por outro lado, o MySQL lidará com isso normalmente, como mostrado abaixo:
Agora insira outra linha sem definir uid
A consulta não falha, o uid apenas salta para 5:
O teste foi realizado no MySQL 5.6.33, para Linux (x86_64) e PostgreSQL 9.4.9
fonte
A partir do Postgres 10, as colunas de identidade conforme definidas pelo padrão SQL também são suportadas:
cria uma coluna de identidade que não pode ser substituída, a menos que seja solicitado explicitamente. A inserção a seguir falhará com uma coluna definida como
generated always
:No entanto, isso pode ser anulado:
Ao usar a opção,
generated by default
esse é essencialmente o mesmo comportamento daserial
implementação existente :Quando um valor é fornecido manualmente, a sequência subjacente também precisa ser ajustada manualmente - o mesmo que com uma
serial
coluna.Uma coluna de identidade não é uma chave primária por padrão (assim como uma
serial
coluna). Se for um, uma restrição de chave primária precisa ser definida manualmente.fonte
Desculpe, refazer uma pergunta antiga, mas essa foi a primeira pergunta / resposta do Stack Overflow que apareceu no Google.
Esta postagem (que surgiu pela primeira vez no Google) fala sobre o uso da sintaxe mais atualizada para o PostgreSQL 10: https://blog.2ndquadrant.com/postgresql-10-identity-columns/
que passa a ser:
Espero que ajude :)
fonte
GENERATED … AS IDENTITY
comandos são SQL padrão. Primeiro adicionado no SQL: 2003 , depois esclarecido no SQL: 2008 . Veja os recursos # T174 e F386 e T178.Você deve ter cuidado para não inserir diretamente em seu campo SERIAL ou sequência, caso contrário, sua gravação falhará quando a sequência atingir o valor inserido:
fonte
No contexto da pergunta feita e em resposta ao comentário de @ sereja1c, criar
SERIAL
implicitamente cria sequências, portanto, para o exemplo acima,CREATE TABLE
criaria implicitamente sequênciafoo_id_seq
para a coluna serialfoo.id
. Portanto,SERIAL
[4 bytes] é bom por sua facilidade de uso, a menos que você precise de um tipo de dados específico para seu ID.fonte
Desta forma, irá funcionar com certeza, espero que ajude:
Você pode verificar isso nos detalhes no próximo link: http://www.postgresqltutorial.com/postgresql-serial/
fonte
Desde o PostgreSQL 10
fonte