生SQLを使ったデータの更新
生SQLを使ったデータの更新
生SQLコマンドUPDATEは,データベースのデータの更新に使う.これは「データの更新」に記載のように,Wolfram言語コマンドSQLUpdateでもできる.
このチュートリアルの例を実際に試してみて,記載の通りに動作しなかった場合は,「データベースの例の使用」で述べているように"DatabaseLink`DatabaseExamples`"パッケージを使ってデータベースをもとの状態に戻す必要があるかもしれない.
データの更新の際,SQLExecuteの結果はクエリの影響を受ける行数を示す整数となる.
以下でデータを更新する例を示す.DatabaseLink をロードし,demoデータベースに接続する.
Needs["DatabaseLink`"];
conn = OpenSQLConnection["demo"];「生SQLを使った表の作成」の例で述べたように,表ADDRESSES,MAILERが作られる.
SQLExecute[conn,
"CREATE TABLE ADDRESSES (
USERNAME VARCHAR(64) NOT NULL PRIMARY KEY,
ADDRESS VARCHAR(64),
CITY VARCHAR(64),
ZIPCODE VARCHAR(16),
UNIQUE (ADDRESS, CITY, ZIPCODE))"];
SQLExecute[conn, "CREATE TABLE MAILER (
MAILERID INT IDENTITY,
USERNAME VARCHAR(64) NOT NULL,
SENDMAILER BIT DEFAULT '1' NOT NULL,
FOREIGN KEY (USERNAME) REFERENCES ADDRESSES (USERNAME))"];
SQLExecute[conn, "INSERT INTO ADDRESSES (USERNAME, ADDRESS, CITY, ZIPCODE) VALUES (`1`)",
{{SQLArgument["user1", "100 Trade Center", "Champaign, IL", "61820"]}, {SQLArgument["user2", "200 Trade Center", "Champaign, IL", "61820"]}, {SQLArgument["user3", "300 Trade Center", "Champaign, IL", "61820"]}}
];
SQLExecute[conn, "INSERT INTO MAILER (MAILERID, USERNAME, SENDMAILER) VALUES (`1`)",
{{SQLArgument[Null, "user1", False]},
{SQLArgument[Null, "user2", False]}}
];SQL文を実行して表MAILERの行を更新する.このクエリはUSERNAMEの値に基づいて列SENDMAILERを更新します.多くの更新文は列の値に作用する条件を使って作られる.
SQLExecute[conn,
"UPDATE MAILER SET SENDMAILER = 1 WHERE USERNAME = 'user1'"]SELECT文を使って表のデータが変更されたことを確認する.
SQLExecute[conn, "SELECT * FROM MAILER"]準備文を使って,データベース内のデータを更新するSQL文を動的に作ることができる.このSQL文は簡単なWolfram言語関数と結合できる.次の例では特定のユーザの住所を更新する.
SetAddress[username_String, address_String] :=
SQLExecute[conn,
"UPDATE ADDRESSES SET ADDRESS = `2` WHERE USERNAME = `1`", {username, address}]SetAddress["user1", "100 Trade Center Office 123"]SQLExecute[conn, "SELECT * FROM ADDRESSES"]データの挿入に適用されるのと同じ制限が,データの更新にも適用される.従ってADDRESSの値を他の行のADDRESSの値と同じになるように更新しようとすると,エラーが返されます.表の中では値は重複できない.
SetAddress["user1", "200 Trade Center"]SQLExecute[conn, "DROP TABLE MAILER"];
SQLExecute[conn, "DROP TABLE ADDRESSES"];
CloseSQLConnection[conn];