生SQLを使ったデータの挿入
SQLコマンドINSERTは,データベースにデータを挿入するときに使う.これは「データの挿入」に記載のようにWolfram言語コマンドのSQLInsertでもできる.
このチュートリアルの例を実際に試してみて,記載の通りに動作しなかった場合は,「データベースの例の使用」で述べているように"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))"];SQL文を使って表ADDRESSESに行を挿入する例である.
SQLExecute[conn,
"INSERT INTO ADDRESSES (USERNAME, ADDRESS, CITY, ZIPCODE) VALUES
('user1', '100 Trade Center', 'Champaign, IL', '61820')"]SQLExecute[conn, "SELECT * FROM ADDRESSES"]列USERNAMEは主キーとなる.つまりこれは重複してはならない.同じデータを再び挿入しようとするとエラーが生じ,結果は$Failedとなる.
SQLExecute[conn,
"INSERT INTO ADDRESSES (USERNAME, ADDRESS, CITY, ZIPCODE) VALUES
('user1', '100 Trade Center', 'Champaign, IL', '61820')"]次はパラメータUSERNAMEを重複しないようにする.ADDRESS,CITY,ZIPCODEの項目はそのままである.これらも重複してはならないので,エラーが生じる.
SQLExecute[conn,
"INSERT INTO ADDRESSES (USERNAME, ADDRESS, CITY, ZIPCODE) VALUES
('user2', '100 Trade Center', 'Champaign, IL', '61820')"]ADDRESS,CITY,ZIPCODEが重複しないように値を挿入する.
SQLExecute[conn,
"INSERT INTO ADDRESSES (USERNAME, ADDRESS, CITY, ZIPCODE) VALUES
('user2', '200 Trade Center', 'Champaign, IL', '61820')"]SQLExecute[conn, "SELECT * FROM ADDRESSES"]データの挿入には準備文の方が役立つことがある.また,SQLArgumentを使うと準備文中の引数領域の数が減って便利であることもある.SQLArgumentについては「SQLExecute:SQLスタイルのクエリにおける引数の列」をご覧いただきたい.
SQLExecute[conn, "INSERT INTO ADDRESSES (USERNAME, ADDRESS, CITY, ZIPCODE) VALUES
(`1`)", {SQLArgument["user3", "300 Trade Center", "Champaign, IL", "61820"]}]SQLExecute[conn, "SELECT * FROM ADDRESSES"]識別列は自動的に値が増加されるため値を必要としないので,大変便利である.これらは表の主キーでもある.つまり一意的に行を識別するのである.識別値はSQL文ではNullと指定しなければならない.
SQLColumnNames[conn, "MAILER"]SQLExecute[conn, "INSERT INTO MAILER (MAILERID, USERNAME, SENDMAILER) VALUES (NULL, 'user1', 0)"]SQLExecute[conn, "SELECT * FROM MAILER"]USERNAMEは外部キーなので,その値はADDRESSESに存在しなければならない.次の例は,user4 が ADDRESSESに存在しないために失敗する.
SQLExecute[conn, "INSERT INTO MAILER (MAILERID, USERNAME, SENDMAILER) VALUES (NULL, 'user4', 0)"]列SENDMAILERはデフォルト値を持っているため,データの挿入時には必要ない.
SQLExecute[conn, "INSERT INTO MAILER (MAILERID, USERNAME) VALUES (NULL, 'user2')"]SELECT文でデータベースにデータが存在し,値を結び付けていることを確認する.
SQLExecute[conn, "SELECT USERNAME, ADDRESS, CITY, ZIPCODE, SENDMAILER FROM ADDRESSES, MAILER WHERE ADDRESSES.USERNAME = MAILER.USERNAME", "ShowColumnHeadings" -> True]//TableFormSQLExecute[conn, "DROP TABLE MAILER"];
SQLExecute[conn, "DROP TABLE ADDRESSES"];
CloseSQLConnection[conn];