2014-01-07 62 views
0

我試圖在mySQL中插入日誌事件到表中(但我對數據庫工作比較陌生)。我有兩個表,一個是用戶名和用戶ID像這樣的表:SQL:在插入到另一個表時有條件地插入/選擇

CREATE TABLE IF NOT EXISTS `users` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(32) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `name` (`name`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

我有日誌消息的表看起來像這樣:

CREATE TABLE IF NOT EXISTS `messages` (
    `messageid` int(11) NOT NULL AUTO_INCREMENT, 
    `userid` int(11) NOT NULL, 
    `timestamp` datetime NOT NULL, 
    `message` text NOT NULL, 
    PRIMARY KEY (`messageid`), 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

我的問題是,當數據來源我需要登錄到「消息」我有三個信息:一個時間戳,一條消息和一個用戶名(不是用戶ID),並且該用戶名可能不在「用戶」表中(但我需要添加它)。爲了解決這個問題我一直在做:

  1. 選擇從用戶獲得與用戶名關聯的ID。
  2. 如果選擇返回0行,請將用戶名插入「users」表中。
  3. 現在將消息插入帶有ID,消息和時間戳的「消息」表中。

這需要每個消息2-3個SQL查詢(這可能是相當大量的數據)。

做1-3號最有效的方法是什麼?

回答

2

你應該能夠做到以下幾點,因爲你有name UNIQUE約束:

INSERT INTO users (name) VALUES ('username') 
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id) 

該查詢將填補該用戶名ID爲在MySQL中LAST_INSERT_ID插槽。然後您可以使用該ID插入消息表中。

下面是一個例子,對於是否有可能讓你多個查詢發送到MySQL:

INSERT INTO users (name) VALUES ('username') 
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id); 

INSERT INTO messages (userid, timestamp, message) 
SELECT LAST_INSERT_ID(), 'timestamp', 'message'; 

如果您使用的是PHP mysqli的,例如,您將能夠通過mysqli_multi_query發送此。

如果您無法一次發送多個查詢,那麼取決於您如何訪問數據庫,SELECT LAST_INSERT_ID()可能無法爲您工作。在這種情況下,你應該手工檢索LAST_INSERT_ID和創建第二個插入查詢是這樣的:

INSERT INTO messages (userid, timestamp, message) 
VALUES ('id', 'timestamp', 'message'); 
+0

我能夠發送多個查詢,讓你的SELECT LAST_INSERT_ID完美地工作,謝謝! – LCC

0

使用插入忽略和條件選擇來分兩步實現這一點。 INSERT IGNORE INTO users(name)VALUES(「raj」);

有條件地在插入消息表時使用最後的插入ID或現有的用戶ID。