2016-04-21 56 views
2

我使用INSERT IGNORE插入所有三列唯一的數據。如何排除時間並檢查日期是否與下面兩列相同?INSERT IGNORE for date,忽略時間

唯一索引列:時間戳,作用,價值

時間戳格式: 2016年4月21日十三時33分47秒

我的表樣:

2016-04-21 13:33:47,發送,郵箱

2016-04-20 11:21:32,發送,郵箱

2016年4月19日17:32:65,發送電子郵件

我想要做的事: 如果我嘗試插入下面的數據,應該被忽略,因爲有對現有數據2016-04-21,發送,郵件。

2016年4月21日19時33分47秒,發送電子郵件

+0

順便說一句,2016-04-19 17:32:65不是一個有效的時間戳。我假設秒是一個錯字。 –

回答

1

IGNORE將工作的唯一方法是,如果你有一個UNIQUE指數一列或多列。在這種情況下,您需要一個來自DATETIMEDATE字段。

例如:

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

如果您使用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' 
+0

您需要5.7.8才能創建該索引:「在MySQL 5.7.8之前,虛擬列無法編制索引。從MySQL 5.7.8開始,InnoDB支持虛擬列的二級索引。」 [CREATE TABLE Syntax](http://dev.mysql.com/doc/refman/5.7/en/create-table。html) –

+0

@Paul Spiegel我無法測試,我沒有5.7.6。但我的理解是,**虛擬**生成的列不能索引,但**存儲**生成的列可以。 –

+0

你是對的:「存儲的列確實需要存儲空間並且可以被索引。」但是 - 好的解決方案。 –

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

的數據,如果在子查詢的條件不具備任何的比賽將只進行插入。