Eu sei que o MySQL limita as colunas auto_increment às chaves primárias. Por que é isso? Meu primeiro pensamento é que é uma restrição de desempenho, pois provavelmente existe uma tabela de contador em algum lugar que deve ser bloqueada para obter esse valor.
Por que não posso ter várias colunas de incremento automático na mesma tabela?
Obrigado.
mysql
primary-key
auto-increment
Christopher Armstrong
fonte
fonte
Respostas:
Por que você deseja ter uma coluna de incremento automático que não é a chave primária?
Se você deseja que uma coluna seja um incremento automático, por definição, não está armazenando dados significativos nessa coluna. O único caso em que o armazenamento de informações não significativas faz sentido é o caso especial em que você deseja ter uma chave primária sintética. Nesse caso, a falta de informações é um benefício, pois não há risco de alguém aparecer no futuro e desejar alterar os dados porque algum atributo de alguma entidade foi alterado.
Ter várias colunas de incremento automático na mesma tabela parece ainda mais estranho. As duas colunas teriam os mesmos dados - elas estão sendo geradas pelo mesmo algoritmo e são preenchidas ao mesmo tempo, afinal. Suponho que você possa criar uma implementação em que seja possível que eles estejam um pouco fora de sincronia se houver sessões simultâneas suficientes. Mas não consigo imaginar como isso seria útil em um aplicativo.
fonte
De fato, o atributo AUTO_INCREMENT não está limitado à PRIMARY KEY (mais nada). Costumava ser assim em versões antigas - definitivamente 3.23 e provavelmente 4.0. Ainda assim, o manual do MySQL para todas as versões desde o 4.1 é assim:
Portanto, você pode realmente ter uma coluna AUTO_INCREMENT em uma tabela que não é a chave primária. Se isso faz sentido, é um tópico diferente.
Também devo mencionar que uma coluna AUTO_INCREMENT deve sempre ser um tipo inteiro (tecnicamente também é permitido um tipo de ponto flutuante) e que deve ser UNSIGNED. Um tipo ASSINADO não apenas desperdiça metade do espaço-chave, mas também pode levar a enormes problemas se um valor negativo for inserido por acidente.
Finalmente, o MySQL 4.1 e posterior define um alias de tipo SERIAL para BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE.
fonte
Essa é uma pergunta interessante, porque diferentes bancos de dados têm abordagens exclusivas para fornecer incremento automático.
MySQL : Apenas uma chave auto_increment é gerada para identificar exclusivamente uma linha em uma tabela. Não há muita explicação por trás do motivo, mas apenas implementação. Dependendo do tipo de dados, os valores de incremento automático são fixados pelo comprimento do tipo de dados em bytes:
PostgreSQL
O tipo de dados interno serial é usado para incremento automático de 1 a 2.147.483.647. Intervalos maiores são permitidos usando bigserial.
Oracle : O objeto de esquema chamado SEQUENCE pode criar novos números simplesmente chamando a função nextval. O PostgreSQL também possui esse mecanismo.
Aqui está um bom URL que fornece como outros bancos de dados os especificam: http://www.w3schools.com/sql/sql_autoincrement.asp
Agora, com relação à sua pergunta, se você realmente deseja ter várias colunas de incremento automático em uma única tabela, precisará imitar isso.
Duas razões pelas quais você deve emular isso:
Como você o emularia ???
Usando várias tabelas que possuem apenas uma coluna de incremento automático e mapeando-as para as colunas desejadas nas tabelas de destino. Aqui está um exemplo:
Copie e cole este exemplo:
Isso criará uma tabela de questionários pop para professores. Também criei cinco emuladores de sequência, um para cada dia da semana escolar. Cada emulador de sequência funciona inserindo o valor 0 na coluna val. Se o emulador de sequência estiver vazio, ele começará com val 0, nextval 1. Caso contrário, a coluna nextval será incrementada. Você pode buscar a coluna nextval no emulador de sequência.
Aqui estão os resultados da amostra do exemplo:
Se você realmente precisa de vários valores de incremento automático no MySQL, esta é a maneira mais próxima de imitá-lo.
De uma chance !!!
ATUALIZAÇÃO 23-06-2011 21:05
Acabei de notar no meu exemplo que não uso o valor @pop.
Desta vez, substituí 'pop_tue = pop_tue + 1' por 'pop_tue = @pop' e tentei novamente o exemplo:
fonte
bigserial
tipo de dados que oferece um intervalo muito maior que 2.147.483.647Como o XL diz, não se limita apenas às chaves primárias. É uma limitação em potencial que você só pode ter uma dessas colunas por tabela, mas a melhor solução é gerar quantos números você precisar em outra tabela e depois inseri-los onde for necessário.
fonte