在忽略时间的情况下插入IGNORE日期

时间:2016-04-21 21:05:06

标签: mysql

我正在使用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,发送,发送电子邮件

3 个答案:

答案 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

只有在子查询中的条件没有任何匹配项时才会插入数据。