Eu tenho o seguinte esquema de tabela;
CREATE TABLE `db1`.`sms_queue` (
`Id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`Message` VARCHAR(160) NOT NULL DEFAULT 'Unknown Message Error',
`CurrentState` VARCHAR(10) NOT NULL DEFAULT 'None',
`Phone` VARCHAR(14) DEFAULT NULL,
`Created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`LastUpdated` TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP,
`TriesLeft` tinyint NOT NULL DEFAULT 3,
PRIMARY KEY (`Id`)
)
ENGINE = InnoDB;
Falha com o seguinte erro:
ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause.
Minha pergunta é: posso ter os dois campos? ou preciso definir manualmente um campo LastUpdated durante cada transação?
mysql
mysql-error-1293
Xenph Yan
fonte
fonte
Respostas:
Na documentação do MySQL 5.5 :
Alterações no MySQL 5.6.5 :
fonte
Changes in MySQL 5.6.5 (2012-04-10, Milestone 8) Previously, at most one TIMESTAMP column per table could be automatically initialized or updated to the current date and time. This restriction has been lifted. Any TIMESTAMP column definition can have any combination of DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP clauses. In addition, these clauses now can be used with DATETIME column definitions. For more information, see Automatic Initialization and Updating for TIMESTAMP and DATETIME.
Existe um truque para ter os dois registros de data e hora, mas com um pouco de limitação.
Você pode usar apenas uma das definições em uma tabela. Crie as duas colunas de carimbo de data e hora da seguinte forma:
Observe que é necessário entrar
null
nas duas colunas duranteinsert
:fonte
stamp_created
também está definido como NOT NULL. O MySQL substituirá automaticamente o NULL pelo registro de data e hora atual.stamp_created
campo como: emstamp_created timestamp default now()
vez de usar um valor 'ZERO'?Você pode ter os dois, basta retirar o sinalizador "CURRENT_TIMESTAMP" no campo criado. Sempre que você criar um novo registro na tabela, use "NOW ()" para um valor.
Ou.
Pelo contrário, remova o sinalizador 'ON UPDATE CURRENT_TIMESTAMP' e envie o NOW () para esse campo. Dessa forma, na verdade, faz mais sentido.
fonte
Se você decidir que o MySQL lide com a atualização dos registros de data e hora, poderá configurar um gatilho para atualizar o campo ao inserir.
Referência do MySQL: http://dev.mysql.com/doc/refman/5.0/en/triggers.html
fonte
É assim que você pode ter campos createDate / lastModified automáticos e flexíveis usando gatilhos:
Primeiro, defina-os assim:
Em seguida, adicione estes gatilhos:
Mas aqui está a parte legal:
fonte
No MySQL 5.6, é fácil de usar ... tente:
fonte
Esse problema parecia ter sido resolvido no MySQL 5.6. Eu notei isso até o MySQL 5.5; aqui está um código de exemplo:
A execução no MySQL 5.5 fornece:
Executando isso no MySQL 5.6
fonte
fonte: http://gusiev.com/2009/04/update-and-create-timestamps-with-mysql/
fonte
Para o mysql 5.7.21, uso o seguinte e funciona bem:
CREATE TABLE
Posts
(modified_at
registro de data e hora NOT NULL DEFAULT CURRENT_TIMESTAMP EM ATUALIZAÇÃO CURRENT_TIMESTAMP,created_at
registro de data e hora NOT NULL DEFAULT CURRENT_TIMESTAMP)fonte
Eu acho que esta é a melhor consulta para stamp_created e stamp_updated
porque quando o registro criado,
stamp_created
deve ser preenchido pornow()
estamp_updated
deve ser preenchido por'0000-00-00 00:00:00'
fonte
Meu host está preso na versão 5.1 do mysql, portanto, qualquer pessoa como eu que não tenha a opção de atualizar pode seguir estas instruções:
http://joegornick.com/2009/12/30/mysql-created-and-modified-date-fields/
fonte