我正在使用INSERT IGNORE插入对所有三列唯一的数据。如果它与下面其他两列的唯一性如何,我如何排除时间并检查日期?
列的唯一索引:时间戳,操作,值
时间戳格式: 2016-04-21 13:33:47
我的表格示例:
2016-04-21 13:33:47,发送,发送电子邮件
2016-04-20 11:21:32,发送,发送电子邮件
2016-04-19 17:32:65,发送,发送电子邮件
我正在尝试做什么: 如果我尝试插入下面的数据,则应该忽略它,因为2016-04-21,发送,电子邮件的现有数据。
2016-04-21 19:33:47,发送,发送电子邮件
答案 0 :(得分:1)
IGNORE
的唯一方法是UNIQUE
索引中有一列或多列。在这种情况下,您需要一个DATE
字段,该字段来自您的DATETIME
。
例如:
ALTER TABLE my_emails ADD COLUMN sent_date DATE
CREATE UNIQUE INDEX idx_sent_date ON my_emails (sent_date)
然后你可以填充它:
UPDATE my_emails SET sent_date=DATE(sent_datetime)
无论这些列是什么。从那时起,您需要确保填充两个字段。
答案 1 :(得分:1)
如果您使用的是MySQL 5.7.6或更高版本,则可以创建具有唯一索引的生成列。
ALTER TABLE table_name
ADD COLUMN timestamp_date DATE GENERATED ALWAYS AS (DATE(timestamp)) STORED,
ADD UNIQUE (timestamp_date, action, value);
使用早期版本的MySQL,您需要添加一列来存储日期并使用触发器(可从5.0.2版获得)在您在表中插入新记录时更新它。
ALTER TABLE table_name
ADD COLUMN timestamp_date DATE;
CREATE TRIGGER insert_table_name_date BEFORE INSERT ON table_name
FOR EACH ROW SET NEW.timestamp_date = DATE(NEW.timestamp);
-- If you already have any data in the table, update it to add the date.
UPDATE table_name SET timestamp_date = DATE(timestamp_date);
ALTER TABLE table_name
ADD UNIQUE (timestamp_date, action, value);
INSERT INTO table_name(timestamp, action, value) VALUES
('2016-04-21 13:33:47', 'send', 'email'),
('2016-04-20 11:21:32', 'send', 'email'),
('2016-04-19 17:32:55', 'send', 'email');
-- 3 row(s) affected
INSERT INTO table_name(timestamp, action, value) VALUES
('2016-04-21 19:33:47', 'send', 'email');
-- Error Code: 1062. Duplicate entry '2016-04-21-send-email' for key 'timestamp_date'
答案 2 :(得分:1)
您可以将INSERT SELECT语句与来自虚拟表的常量数据一起使用。这样您就可以包含WHERE子句。
insert into actions (`timestamp`, action, value)
select '2016-04-21 19:33:47', 'send', 'email'
from (select 1) dummy
where not exists (
select 1
from actions
where action = 'send'
and value = 'email'
and date(`timestamp`) = '2016-04-21'
);
http://sqlfiddle.com/#!9/5882c/1
只有在子查询中的条件没有任何匹配项时才会插入数据。