原文:
插入查詢必須使用查詢構造器物件,不同的資料庫需要對lob欄位(大物件,比如mysql的text型別)和blob欄位(二進位製大物件)的特殊處理,所以需要使用抽象層來適應不同資料庫驅動處理的需要。
插入查詢從以下方式使用db_insert()函式開始:
<?php
$query= db_insert('node',$options);
?>
這就建立了乙個可以插入多個記錄到node表裡的插入查詢物件。注意這裡的表名外面也不需要大括號,查詢構造器會自動處理。
插入查詢使用了流暢api(fluent api)設計,也就是說,所有的方法(除了execute())都會返回查詢物件自身以允許使用鏈式呼叫。在大多數情況下,這意味著查詢物件就完全不需要被儲存成變數了。
插入查詢物件支援數種使用模式以適應不同的需要。通常的工作流包括指定要插入資料的字段,指定要插入欄位的資料,然後執行這個查詢。下面列出了通常推薦使用的一些使用模式。
緊湊形式
對大多插入查詢推薦的形式是緊湊形式:
<?php
$nid= db_insert('node')
->fields(
array
('title'=>'example',
'uid'=>1,
'created'=> request_time,
))->execute();
?>
這將產生乙個等價的如下查詢:
insert into (title, uid, created) values (『example』, 1, 1221717405);
<?php
db_insert('node')
?>
這一行建立了乙個針對node表的新查詢物件。
<?php
->fields(
array
('title'=>'example',
'uid'=>1,
'created'=> request_time,
))?>
fields()方法有很多種形式的引數,不過最常用的是單個關聯陣列的形式。陣列的鍵是將要插入資料表的列名,陣列的值是對應的要插入的值。這將會對指定表執行乙個選擇查詢。
<?php
->execute();
?>
呼叫execute()方法會執行這個查詢,在這個方法呼叫之前查詢不會被執行。
與其它會返回插入查詢物件自身的方法不同,如果插入查詢中有個自增欄位,那麼execute()會返回乙個這個欄位的值。所以上面例子中,返回值直接賦給了$nid變數。如果沒有自增字段,execute()的返回的將是乙個未定義值,不能使用。
多數時候,這是使用插入查詢最好的形式。
退化形式<?php
$nid= db_insert('node')
->fields(
array
('title','uid','created'))
->values(
array
('title'=>'example',
'uid'=>1,
'created'=> request_time,
))->execute();
?>
這是之前查詢的一種更冗長的等價形式,結果完全一樣。
<?php
->fields(
array
('title','uid','created'))
?>
當fields()用乙個索引陣列而不是關聯陣列做引數被呼叫時,它只用於設定查詢中要用到字段(資料列)而不需設定任何值,如果需要在稍後進行多個插入查詢操作的時候會很有用。
<?php
->values(
array
('title'=>'example',
'uid'=>1,
'created'=> request_time,
))?>
這個方法指定了乙個關聯陣列,包含要插入資料庫的欄位名和值。values()方法也可以使用索引陣列,如果使用的是索引陣列,值的順序必須和fields()方法中設定的字段的順序相同。如果使用的是關聯陣列則可以是任意順序。通常使用關聯陣列會有更好的可讀性。
這種查詢形式很少使用,通常緊湊模式會更好。在通常情況下只適合分開fields()和values()進行多次插入查詢。
多插入形式
插入查詢物件也可以多次進行值的設定,也就是說,values()可以被多次呼叫,以便順序執行多個插入語句。特別是有可能這種操作會帶來資料庫相容性問題。對於大多數資料庫來說,多次插入語句將會在一次事務操作中一起執行以便更好的資料整合和提高速度,在mysql中這將會使用mysql的多值插入語法。
<?php
$values=
array
(array
('title'=>'example',
'uid'=>1,
'created'=> request_time,
),array
('title'=>'example 2',
'uid'=>1,
'created'=> request_time,
),array
('title'=>'example 3',
'uid'=>2,
'created'=> request_time,
),);
$query= db_insert('node')->fields(
array
('title','uid','created'));
foreach($valuesas$record)
$query->execute();
?>
上面的例子將會同時執行三段插入語句作為一次操作,使用的是對於特定資料庫驅動來說最有效率的方式。注意這裡我們將查詢物件儲存到乙個變數當中,這樣我們可以迴圈遍歷$values並且重複呼叫values()方法。
在原始碼中,上面的例子等效於以下三個查詢:
insert into (title, uid, created) values ('example', 1, 1221717405);insert into (title, uid, created) values ('example2', 1, 1221717405);insert into (title, uid, created) values ('example3', 2, 1221717405);
注意在多插入查詢中execute()的返回值是未定義的,不應該被使用,因為它非常依賴於使用的資料庫驅動。
基於查詢結果的插入
如果你希望用另乙個表裡查詢的結果來填充乙個表,你既可以在源表中使用select,把資料讀取到php中然後插入到新錶,也只可以執行乙個inert into…select from查詢把所有選擇查詢中返回的記錄都填充到插入查詢中。
在這個例子中,我們希望建立乙個叫「mytable」的表,包含系統中所有page型別的節點的節點id和使用者名稱。
drupal 6<?php
db_query('insert into (nid, name) select n.nid, u.name from n left join u on n.uid = u.uid where n.type = "%s"',
array
('page'));
?>drupal 7<?php
// 建立select查詢。
$query= db_select('node','n');
// 連線使用者表。
$query->
join
('users','u','n.uid = u.uid');
// 新增需要的字段。
$query->addfield('n','nid');
$query->addfield('u','name');
// 新增只查詢page節點的條件。
$query->condition('type','page');
// 執行查詢
db_insert('mytable')
->from($query)
->execute();
?>預設值
在通常情況下,如果不給字段指定乙個值,那麼由資料表的構架(schema)定義的預設值將會被自動插入。有些時候,比如你希望整個記錄都使用預設值的情況下,你需要明確的告訴資料庫使用預設值。要明確的告訴資料庫使用預設值,使用usedefaults()方法。
<?php
$query->usedefaults(
array
('field1','field2'));
?>
這一行表明了查詢將對fields和fields2使用資料庫定義的預設值。注意如果同時對乙個字段使用usedefault()和values()會出現錯誤丟擲乙個異常。
drupal學習之 目錄結構
includes 包含了大量的inc檔案,這些inc檔案裡面存放了drupal常用的函式 misc 存放了drupal安裝中可用的js,imagemodules 存放drupal的核心模組 drupal真正的核心模組其實只有5個 profiles 站點的安裝大綱 sites 包含了你對drupal所...
MyBatis批量插入和批量新增。
曾在學習redis時,技術牛畫了乙個資料庫的發展圖,redis最終發展竟是關係型資料庫 你恨不得想說個oh 就像ibatis發展到mybatis,最後發展方向極可能是hibernate,這個.create table batch options test id varchar2 50 not nul...
linux批量新增使用者和批量修改密碼
一 批量建立使用者 通過命令newusers可以實現批量的建立使用者。這個命令的用法為 newusers file.txt 乙個文字檔案 文字檔案內存放需要批量新增的使用者資訊 但是對格式有要求 格式 pw name pw passwd pw uid pw gid pw gecos pw dir p...