Xen*_*Yan 123 mysql mysql-error-1293
我有以下表模式;
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;
Run Code Online (Sandbox Code Playgroud)
它失败并出现以下错误:
ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause.
Run Code Online (Sandbox Code Playgroud)
我的问题是,我可以同时拥有这两个领域吗?或者我必须在每次交易期间手动设置LastUpdated字段?
Rob*_*ble 122
表中的一个TIMESTAMP列可以将当前时间戳作为初始化列的默认值,作为自动更新值,或两者.当前时间戳不可能是一列的默认值和另一列的自动更新值.
以前,每个表最多只能有一个TIMESTAMP列自动初始化或更新到当前日期和时间.这一限制已被取消.任何TIMESTAMP列定义都可以包含DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP子句的任意组合.此外,这些子句现在可以与DATETIME列定义一起使用.有关更多信息,请参阅TIMESTAMP和DATETIME的自动初始化和更新.
Bog*_*iev 83
您只能在一个表中使用其中一个定义.像这样创建两个时间戳列:
create table test_table(
id integer not null auto_increment primary key,
stamp_created timestamp default '0000-00-00 00:00:00',
stamp_updated timestamp default now() on update now()
);
Run Code Online (Sandbox Code Playgroud)
请注意,null在以下期间必须输入两列insert:
mysql> insert into test_table(stamp_created, stamp_updated) values(null, null);
Query OK, 1 row affected (0.06 sec)
mysql> select * from test_table;
+----+---------------------+---------------------+
| id | stamp_created | stamp_updated |
+----+---------------------+---------------------+
| 2 | 2009-04-30 09:44:35 | 2009-04-30 09:44:35 |
+----+---------------------+---------------------+
2 rows in set (0.00 sec)
mysql> update test_table set id = 3 where id = 2;
Query OK, 1 row affected (0.05 sec) Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from test_table;
+----+---------------------+---------------------+
| id | stamp_created | stamp_updated |
+----+---------------------+---------------------+
| 3 | 2009-04-30 09:44:35 | 2009-04-30 09:46:59 |
+----+---------------------+---------------------+
2 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
Ste*_*her 28
您可以同时使用它们,只需在创建的字段上取下"CURRENT_TIMESTAMP"标志即可.无论何时在表中创建新记录,只需使用"NOW()"作为值.
要么.
相反,删除'ON UPDATE CURRENT_TIMESTAMP'标志并为该字段发送NOW().这种方式实际上更有意义.
web*_*ler 26
如果您决定让MySQL处理时间戳的更新,您可以设置触发器来更新插入字段.
CREATE TRIGGER <trigger_name> BEFORE INSERT ON <table_name> FOR EACH ROW SET NEW.<timestamp_field> = CURRENT_TIMESTAMP;
Run Code Online (Sandbox Code Playgroud)
MySQL参考:http://dev.mysql.com/doc/refman/5.0/en/triggers.html
ali*_*ien 23
这是如何使用触发器自动和灵活的createDate/lastModified字段:
首先像这样定义它们:
CREATE TABLE `entity` (
`entityid` int(11) NOT NULL AUTO_INCREMENT,
`createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`lastModified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`name` varchar(255) DEFAULT NULL,
`comment` text,
PRIMARY KEY (`entityid`),
)
Run Code Online (Sandbox Code Playgroud)
然后添加这些触发器:
DELIMITER ;;
CREATE trigger entityinsert BEFORE INSERT ON entity FOR EACH ROW BEGIN SET NEW.createDate=IF(ISNULL(NEW.createDate) OR NEW.createDate='0000-00-00 00:00:00', CURRENT_TIMESTAMP, IF(NEW.createDate<CURRENT_TIMESTAMP, NEW.createDate, CURRENT_TIMESTAMP));SET NEW.lastModified=NEW.createDate; END;;
DELIMITER ;
CREATE trigger entityupdate BEFORE UPDATE ON entity FOR EACH ROW SET NEW.lastModified=IF(NEW.lastModified<OLD.lastModified, OLD.lastModified, CURRENT_TIMESTAMP);
Run Code Online (Sandbox Code Playgroud)
但这是很好的部分:
Sha*_*ssy 21
从MySQL 5.6开始,它很容易...尝试一下:
create table tweet (
id integer not null auto_increment primary key,
stamp_created timestamp default now(),
stamp_updated timestamp default now() on update now(),
message varchar(163)
)
Run Code Online (Sandbox Code Playgroud)