Por que pode haver apenas uma coluna TIMESTAMP com CURRENT_TIMESTAMP na cláusula DEFAULT ou ON UPDATE?
CREATE TABLE `foo` (
`ProductID` INT(10) UNSIGNED NOT NULL,
`AddedDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UpdatedDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=INNODB;
O erro que resulta:
Código de erro: 1293
Definição de tabela incorreta; pode haver apenas uma coluna TIMESTAMP com CURRENT_TIMESTAMP na cláusula DEFAULT ou ON UPDATE
mysql
timestamp
mysql-error-1293
ripper234
fonte
fonte
CURRENT_TIMESTAMP
inDEFAULT
ouON UPDATE
cláusula uma vez que exista uma coluna comTIMESTAMP
tipo de dados, independentemente de ter uma cláusula extra!CREATE TABLE foo (created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_on TIMESTAMP)
CREATE TABLE foo (updated_on TIMESTAMP, created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP)
timestamp
coluna for anulável, ou sejanull
. Se a primeiratimestamp
coluna fornot null
, por padrão,DEFAULT CURRENT_TIMESTAMP
eON UPDATE CURRENT_TIMESTAMP
será adicionada. stackoverflow.com/a/13544181/2859238 #timestamp
coluna tiver um valor padrão explícito definido comodefault '0000-00-00 00:00:00'
. Se a coluna for anulável ou se o valor padrão explicitamente for definido,DEFAULT CURRENT_TIMESTAMP
eON UPDATE CURRENT_TIMESTAMP
NÃO será adicionado #Respostas:
Essa limitação, devido apenas a razões históricas de legado de código, foi levantada nas versões recentes do MySQL:
http://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-5.html
fonte
Eu também me perguntei isso há muito tempo. Pesquisei um pouco na minha história e acho que este post: http://lists.mysql.com/internals/34919 representa a posição semioficial do MySQL (antes da intervenção da Oracle;))
Em resumo:
Portanto, a explicação deles é "porque é implementada assim". Não parece muito científico. Eu acho que tudo vem de algum código antigo. Isso é sugerido no encadeamento acima: "transferência a partir de quando apenas o primeiro campo de registro de data e hora foi definido automaticamente / atualizado".
Felicidades!
fonte
Podemos fornecer um valor padrão para o carimbo de data / hora para evitar esse problema.
Esta postagem fornece uma solução detalhada: http://gusiev.com/2009/04/update-and-create-timestamps-with-mysql/
fonte
De fato, uma falha de implementação.
A abordagem nativa no MySQL é atualizar você mesmo uma data de criação (se você precisar de uma) e fazer com que o MySQL se preocupe com o timestamp da seguinte
update date ? update date : creation date
maneira:Na criação, insira NULL:
Os valores NULL para o registro de data e hora são interferidos como CURRENT_TIMESTAMP por padrão.
No MySQL, a primeira coluna TIMESTAMP de uma tabela obtém ambos
DEFAULT CURRENT_TIMESTAMP
eON UPDATE CURRENT_TIMESTAMP
atributo, se nenhum atributo for fornecido para ela. é por isso que a coluna TIMESTAMP com atributos deve vir primeiro ou você obtém o erro descrito neste encadeamento.fonte
Tal como:
fonte
Bem, uma correção para você pode ser colocá-lo no campo UpdatedDate e ter um gatilho que atualize o campo AddedDate com o valor UpdatedDate apenas se AddedDate for nulo.
fonte
Combinando várias respostas:
No MySQL 5.5,
DEFAULT CURRENT_TIMESTAMP
eON UPDATE CURRENT_TIMESTAMP
não pode ser adicionado,DATETIME
mas apenas ativadoTIMESTAMP
.Regras:
1) no máximo uma
TIMESTAMP
coluna por tabela pode ser automaticamente (ou manualmente [ Minha adição ]) inicializada ou atualizada para a data e hora atuais. (Documentos do MySQL).Assim, apenas um
TIMESTAMP
pode terCURRENT_TIMESTAMP
emDEFAULT
ouON UPDATE
cláusula2) A primeira
NOT NULL
TIMESTAMP
coluna sem umDEFAULT
valor explícito comocreated_date timestamp default '0000-00-00 00:00:00'
receberá implicitamente umaDEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
e, portanto, asTIMESTAMP
colunas subsequentes não poderão ser fornecidas nemCURRENT_TIMESTAMP
na cláusulaDEFAULT
ON UPDATE
Outra opção (mas
updated_date
é a primeira coluna):fonte
Tente o seguinte:
fonte
created_at
coluna você mesmo. Eu acho que é isso que op quer dizer intencionalmente.Essa é a limitação na versão do MYSQL 5.5. Você precisa atualizar a versão para 5.6.
Eu estava recebendo esse erro ao adicionar uma tabela no MYSQL
tabela se parece com isso.
Depois de algum tempo lendo sobre mudanças em diferentes versões do MYSQL e alguns dos googling. Descobri que algumas alterações foram feitas no MYSQL versão 5.6 sobre versão 5.5.
Este artigo ajudará você a resolver o problema. http://www.oyewiki.com/MYSQL/Incorrect-table-definition-there-can-be-only-one-timestamp-column
fonte