AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 259747
Accepted
Max Muster
Max Muster
Asked: 2020-02-15 16:16:07 +0800 CST2020-02-15 16:16:07 +0800 CST 2020-02-15 16:16:07 +0800 CST

Único em 2 colunas

  • 772

Eu tenho 2 colunas col1 e col2

PERGUNTA INICIAL:
é possível fazer uma restrição para não poder adicionar o mesmo email duas vezes nestas colunas, usando apenas índices?

A pergunta foi editada para: " É possível definir uma restrição para não poder adicionar o mesmo email duas vezes nessas colunas para o mesmo registro , usando apenas índices? "

Mas a culpa é minha, não dei detalhes suficientes. Quando eu tenho uma coluna exclusiva . Não posso repetir uma entrada nesta coluna. O que eu preciso é expandir esse "único" para uma segunda coluna, para que qualquer entrada feita na primeira coluna não seja possível entrar na segunda coluna.

Eu posso fazer isso usando um programa externo consequentemente adicionando as entradas para essas duas colunas em uma matriz e sempre verificando a matriz antes de inserir algo nessas duas colunas. Mas a solução é uma piada, é sub-ótima, porque por extrapolação não precisamos mais de bancos de dados, podemos usar arrays.

Isso é possível usando apenas mysql ou preciso de "minha matriz"?

mysql mariadb
  • 4 4 respostas
  • 89 Views

4 respostas

  • Voted
  1. Eric
    2020-02-15T16:24:16+08:002020-02-15T16:24:16+08:00

    Eu acho que você pode usar CHECKrestrição

    ALTER TABLE foo 
      ADD CONSTRAINT email1_is_not_email2_CHK
        CHECK (email1 <> email2) ;
    
    • 4
  2. John K. N.
    2020-02-18T02:52:27+08:002020-02-18T02:52:27+08:00

    Sim, você pode conseguir isso com a CHECKopção na CREATE/ALTER TABLEinstrução, mas apenas para MySQL desde v8.0.16 e MariaDB desde v10.2.1.

    Referência: 13.1.20.7 CHECK Constraints (MySQL Dev Documentation) e CONSTRAINT (MariaDB KB)

    Exemplo

    Criar a tabela

    create table emlchk
    (
    check (email1 <> email2),
    emlchk_id int not null auto_increment,
    email1 varchar(100),
    email2 varchar(100),
    primary key (emlchk_id)
    )
    

    Inserir primeiros registros

    insert into emlchk 
    (email1, email2) 
    values
    ('[email protected]', '[email protected]')
    

    A inserção falhará com a mensagem:

    A restrição de verificação 'emlchk_chk_1' foi violada.

    Verifique o conteúdo da tabela

    select * from emlchk
    

    Sim, a mesa ainda está vazia.

    Inserir registros válidos

    insert into emlchk 
    (email1, email2) 
    values
    ('[email protected]', '[email protected]'),
    ('[email protected]', ''),
    ('','[email protected]')
    

    ...e verifique:

    select * from emlchk
    

    ...que retorna:

    emlchk_id | e-mail1 | e-mail2                      
    --------: | :--------------------------- | :---------------------------
            1 | algo_um@domínio.com | algo_dois@domínio.com    
            2 | algo_um_um@domínio.com |                             
            3 | | algo_dois_dois@domínio.com
    

    Atualizar segunda coluna com os mesmos dados

    update emlchk set email2 = '[email protected]' where email1 = '[email protected]'
    

    Devoluções:

    A restrição de verificação 'emlchk_chk_1' foi violada.

    Atualizar segunda coluna com dados diferentes

    update emlchk set email2 = '[email protected]' where email1 = '[email protected]' 
    

    Isso parece funcionar.

    Exemplo Completo

    O exemplo completo pode ser encontrado em db<>fiddle .

    • 1
  3. Best Answer
    Rick James
    2020-02-23T10:48:12+08:002020-02-23T10:48:12+08:00

    Hoje você permite 2 emails; amanhã você permitirá 3. Isso implora por ter uma mesa separada. Tal permitirá que você use UNIQUE.

    Uma regra de design de esquema: não use várias colunas para implementar uma "matriz"; use uma tabela separada.

    • 1
  4. Siva Koteswara Rao
    2020-02-16T12:03:09+08:002020-02-16T12:03:09+08:00
    ALTER TABLE table_name
    ADD CONSTRAINT constraint_name UNIQUE KEY(email1,email2);
    
    • -3

relate perguntas

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve