生SQLを使ったデータの削除
生SQLを使ったデータの削除
生SQLコマンドDELETEは,データベースからデータを削除するときに使う.これは「データの削除」に記載のように,Wolfram言語コマンドSQLDeleteでもできる.
このチュートリアルの例を実際に試してみて,記載の通りに動作しなかった場合は,「データベースの例の使用」で述べているように"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", True]}}
];SQLExecute[conn, "SELECT * FROM ADDRESSES"]SQLExecute[conn, "SELECT * FROM MAILER"]以下は表MAILERの行を削除するSQL文を実行する.列SENDMAILERの値が0またはFalseである行をすべて削除する.削除文は列の値に応じた条件を使って作成できる.1行削除されるため,結果は1となる.
SQLExecute[conn, "DELETE FROM MAILER WHERE SENDMAILER = 0"]SELECT文はテーブルでデータが変更されたことを検証する.
SQLExecute[conn, "SELECT * FROM MAILER"]準備文を使って,データベース内のデータを更新するSQL文を動的に作ることができる.このSQL文は簡単なWolfram言語関数と結合できる.次の例は特定のユーザの住所を削除する.
DeleteAddress[username_String] :=
SQLExecute[conn,
"DELETE FROM ADDRESSES WHERE USERNAME = `1`", {username}]DeleteAddress["user3"]SQLExecute[conn, "SELECT * FROM ADDRESSES"]表の値に対する制限と同じ制限が,データの削除にも適用される.したがって,表MAILERの項目が参照しているADDRESSの値を削除しようとすると,エラーが返される.
DeleteAddress["user2"]SQLExecute[conn, "DROP TABLE MAILER"];
SQLExecute[conn, "DROP TABLE ADDRESSES"];
CloseSQLConnection[conn];