Olá Luidi.
Vamos tentar entender.
- O que acontece quando você coloca
unique: true no modelo
Quando você define algo assim no modelo:
const Usuario = sequelize.define('Usuario', {
email: {
type: DataTypes.STRING,
unique: true,
},
});
Você está declarando para o Sequelize que esse campo deve ser único.
Mas isso só tem efeito real no banco de dados se o Sequelize criar ou alterar a tabela ou seja, se houver uma sincronização (sync) ou uma migração que reflita essa configuração no schema.
Se você apenas atualiza o modelo no código, mas não recria ou altera a tabela no banco, o Sequelize não aplica automaticamente essa constraint, porque ele não altera o schema do banco de dados existente sozinho.
- Por que funcionou apenas quando você criou a constraint na migração
Quando você escreveu uma migração como:
await queryInterface.addConstraint('Usuarios', {
fields: ['email'],
type: 'unique',
name: 'unique_email_constraint'
});
Essa migração de fato executou um comando SQL no banco, algo como:
ALTER TABLE "Usuarios" ADD CONSTRAINT "unique_email_constraint" UNIQUE ("email");
Agora, o banco está fisicamente garantindo a unicidade da coluna email.
Isso é o que realmente impede registros duplicados, independentemente da aplicação.
- Então, o
unique do modelo serve pra quê?
O unique dentro do modelo serve principalmente para: - Gerar a constraint quando o Sequelize cria a tabela pela primeira vez via
sequelize.sync({ force: true }) ou sequelize.sync({ alter: true }). - Documentar (de forma declarativa) no modelo que aquele campo deve ser único.
- Permitir que ferramentas do Sequelize (como validações de schema) saibam que a coluna é única.
Mas se o banco já foi criado, e você não sincroniza novamente o schema, essa configuração não muda nada no banco.
Em projetos reais (principalmente em produção), sempre use migrações para criar ou alterar constraints.
Use unique: true no modelo para manter a consistência entre código e banco, mas não confie apenas nele.
Nunca use sync({ force: true }) em produção. Isso apaga tabelas.
Comente ai qualquer duvida.
Bons estudos.