2011-07-09 35 views
0

我想要一個簡寫(如果可能)將多個記錄插入到具有主鍵和IsIdentity屬性的表中。例如,假設我有一個表稱爲 '人' 與下列:
- ID(主鍵,標識[即自動增量])
- 名稱(NOT NULL)
- 電子郵件(不爲null)
帶主鍵和標識的多重插入速記

不包括自動遞增ID列中的INSERT語句是完全有效的,如:

 
INSERT INTO People VALUES ('George', '[email protected]')

但是,如果我想在同一個語句插入多個值,理想可以做這樣的事情,我不必明確指定列名

 
INSERT INTO People VALUES (
    (auto, 'George', '[email protected]'), 
    (auto, 'Mary', '[email protected]') 
)

我能找到的最好的解決辦法是這樣的:

 
INSERT INTO People (
    SELECT 'George', '[email protected]', 
    UNION ALL 
    SELECT 'Mary', '[email protected]' 
)

我想你可能會說,這是一個有點意思的追求,但我想查詢本身沿着可擴展與表設計。例如,如果列名更改,或者添加了更多列,那麼在代碼中無需更改此處。

乾杯:)

+1

大多數情況下最簡單的方法不是最好的方法......牢記這一點。 – JNK

回答

2

您可以插入多行這樣的:

INSERT INTO `People` (`name`,`email`) VALUES ('George', '[email protected]'),('Mary', '[email protected]'); 

編輯:

mysql> create table `test`(
    -> `id` int(10) unsigned not null AUTO_INCREMENT, 
    -> `name` varchar(255) not null default 'N/A/', 
    -> `email` varchar(255) not null default 'N/A/', 
    -> PRIMARY KEY(`id`) 
    ->)ENGINE=MyISAM DEFAULT CHARSET=latin1; 
Query OK, 0 rows affected (0.02 sec) 

mysql> INSERT INTO `test` VALUES (null, 'Name 1', 'Email 1'),(null, 'Name 2','Email 2'); 
Query OK, 2 rows affected (0.00 sec) 
Records: 2 Duplicates: 0 Warnings: 0 

mysql> select * from `test`; 
+----+--------+---------+ 
| id | name | email | 
+----+--------+---------+ 
| 1 | Name 1 | Email 1 | 
| 2 | Name 2 | Email 2 | 
+----+--------+---------+ 
2 rows in set (0.00 sec) 

只要你的主鍵設置爲自動增量,則可以抵消該字段將自動將該值設置爲自動增量值。

+0

對不起,但也許你錯過了我的粗體評論,不明確包括屬性名稱,哈哈。我欣賞嘗試,雖然:) – Chiramisu

+0

你不技術上「有」,我做它出於習慣。只要你存儲每個字段的值,你就沒問題。 –

+0

如果用戶具有user_id,姓名和電子郵件順序,你應該使用VALUES(null,'Name','Email'),(null,'Name 2','Email 2')等 –

1

這取決於你正在使用的數據庫。一些數據庫允許多個值集:

insert into People values 
(auto, 'George', '[email protected]'), 
(auto, 'Mary', '[email protected]') 
+0

特別是MS SQL 2008 R2,但我不知道如果德納利將實現此功能? – Chiramisu

+0

@Chiramisu:實際上,這個特性是在SQL Server 2008中引入的 - 我很確定它仍然會在Denali中(或者你認爲它會被刪除嗎?) –

+0

那麼如果它確實存在在2008年,我還沒有看到如何使用它。 >< – Chiramisu