Добавление данных в базу данных предполагает выполнение инструкции SQL
INSERT
. По завершении выполнения инструкции можно получить доступ к первичному ключу вновь вставленной сроки, если такой ключ был создан базой данных.
Выполнение инструкции INSERT
Для добавления данных в таблицу базы данных необходимо создать и выполнить экземпляр
SQLStatement
, текстом которого является инструкция SQL
INSERT
.
В следующем примере экземпляр SQLStatement используется для добавления строки данных в уже существующую таблицу «employees». Этот пример иллюстрирует вставку данных с использованием режима асинхронного выполнения. Заметьте, что данный код предполагает наличие инициализированного и подключенного к базе данных экземпляра
SQLConnection
с именем
conn
. Он также предполагает, что таблица «employees» уже создана.
import flash.data.SQLConnection;
import flash.data.SQLResult;
import flash.data.SQLStatement;
import flash.events.SQLErrorEvent;
import flash.events.SQLEvent;
// ... create and open the SQLConnection instance named conn ...
// create the SQL statement
var insertStmt:SQLStatement = new SQLStatement();
insertStmt.sqlConnection = conn;
// define the SQL text
var sql:String =
"INSERT INTO employees (firstName, lastName, salary) " +
"VALUES ('Bob', 'Smith', 8000)";
insertStmt.text = sql;
// register listeners for the result and failure (status) events
insertStmt.addEventListener(SQLEvent.RESULT, insertResult);
insertStmt.addEventListener(SQLErrorEvent.ERROR, insertError);
// execute the statement
insertStmt.execute();
function insertResult(event:SQLEvent):void
{
trace("INSERT statement succeeded");
}
function insertError(event:SQLErrorEvent):void
{
trace("Error message:", event.error.message);
trace("Details:", event.error.details);
}
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()">
<mx:Script>
<![CDATA[
import flash.data.SQLConnection;
import flash.data.SQLResult;
import flash.data.SQLStatement;
import flash.events.SQLErrorEvent;
import flash.events.SQLEvent;
private function init():void
{
// ... create and open the SQLConnection instance named conn ...
// create the SQL statement
var insertStmt:SQLStatement = new SQLStatement();
insertStmt.sqlConnection = conn;
// define the SQL text
var sql:String =
"INSERT INTO employees (firstName, lastName, salary) " +
"VALUES ('Bob', 'Smith', 8000)";
insertStmt.text = sql;
// register listeners for the result and failure (status) events
insertStmt.addEventListener(SQLEvent.RESULT, insertResult);
insertStmt.addEventListener(SQLErrorEvent.ERROR, insertError);
// execute the statement
insertStmt.execute();
}
private function insertResult(event:SQLEvent):void
{
trace("INSERT statement succeeded");
}
private function insertError(event:SQLErrorEvent):void
{
trace("Error message:", event.error.message);
trace("Details:", event.error.details);
}
]]>
</mx:Script>
</mx:WindowedApplication>
Следующий код вставляет строку данных в уже существующую таблицу «employees» с использованием режима синхронного выполнения. Заметьте, что данный код предполагает наличие инициализированного и подключенного к базе данных экземпляра
SQLConnection
с именем
conn
. Он также предполагает, что таблица «employees» уже создана.
import flash.data.SQLConnection;
import flash.data.SQLResult;
import flash.data.SQLStatement;
import flash.errors.SQLError;
// ... create and open the SQLConnection instance named conn ...
// create the SQL statement
var insertStmt:SQLStatement = new SQLStatement();
insertStmt.sqlConnection = conn;
// define the SQL text
var sql:String =
"INSERT INTO employees (firstName, lastName, salary) " +
"VALUES ('Bob', 'Smith', 8000)";
insertStmt.text = sql;
try
{
// execute the statement
insertStmt.execute();
trace("INSERT statement succeeded");
}
catch (error:SQLError)
{
trace("Error message:", error.message);
trace("Details:", error.details);
}
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()">
<mx:Script>
<![CDATA[
import flash.data.SQLConnection;
import flash.data.SQLResult;
import flash.data.SQLStatement;
import flash.errors.SQLError;
private function init():void
{
// ... create and open the SQLConnection instance named conn ...
// create the SQL statement
var insertStmt:SQLStatement = new SQLStatement();
insertStmt.sqlConnection = conn;
// define the SQL text
var sql:String =
"INSERT INTO employees (firstName, lastName, salary) " +
"VALUES ('Bob', 'Smith', 8000)";
insertStmt.text = sql;
try
{
// execute the statement
insertStmt.execute();
trace("INSERT statement succeeded");
}
catch (error:SQLError)
{
trace("Error message:", error.message);
trace("Details:", error.details);
}
}
]]>
</mx:Script>
</mx:WindowedApplication>
Извлечение созданного базой данных первичного ключа вставленной строки
Часто после вставки строки данных в таблицу код требует первичный ключ, созданный базой данных, или значение идентификатора строки для вновь вставленной строки. Например, при вставке строки в одну таблицу может потребоваться вставить строки в связанную таблицу. В таком случае потребуется вставить значение первичного ключа в качестве внешнего ключа в связанную таблицу. Первичный ключ вставленной строки можно извлечь при помощи объекта
SQLResult
, созданного при выполнении инструкции. Это тот же объект, что используется для доступа к данным результатов после выполнения инструкции
SELECT
. Как и в случае с любой другой инструкцией SQL, по завершении выполнения инструкции
INSERT
среда выполнения создает экземпляр SQLResult. Доступ к экземпляру
SQLResult
осуществляется путем вызова метода
getResult()
объекта SQLStatement, если используется прослушиватель событий или режим синхронного выполнения. Наоборот, если используется режим асинхронного выполнения и экземпляр
Responder
передается вызову метода
execute()
, экземпляр SQLResult передается в качестве аргумента функции обработчика результатов. В любом случае экземпляр SQLResult имеет свойство,
lastInsertRowID
, которое содержит идентификатор последней вставленной строки, если выполненная инструкция SQL является инструкцией
INSERT
.
Следующий пример иллюстрирует доступ к первичному ключу вставленной строки в режиме асинхронного выполнения:
insertStmt.text = "INSERT INTO ...";
insertStmt.addEventListener(SQLEvent.RESULT, resultHandler);
insertStmt.execute();
function resultHandler(event:SQLEvent):void
{
// get the primary key
var result:SQLResult = insertStmt.getResult();
var primaryKey:Number = result.lastInsertRowID;
// do something with the primary key
}
Следующий пример иллюстрирует доступ к первичному ключу вставленной строки в режиме синхронного выполнения:
insertStmt.text = "INSERT INTO ...";
try
{
insertStmt.execute();
// get the primary key
var result:SQLResult = insertStmt.getResult();
var primaryKey:Number = result.lastInsertRowID;
// do something with the primary key
}
catch (error:SQLError)
{
// respond to the error
}
Заметьте, что идентификатор строки может представлять собой значение столбца, обозначенного как столбец первичного ключа в определении таблицы, а может и не представлять собой это значение. Это определяется в соответствии со следующими правилами:
-
Если в определении таблицы задан столбец первичного ключа, который относится к типу данных
INTEGER
, свойство
lastInsertRowID
содержит значение, которое было вставлено в эту строку (или значение, созданное средой выполнения, если это столбец
AUTOINCREMENT
).
-
Если в определении таблицы задано несколько столбцов первичного ключа (составной ключ) или один столбец первичного ключа с типом данных, отличным от типа
INTEGER
, база данных незаметно создает целочисленное значение идентификатора строки. Это созданное значение является значением свойства
lastInsertRowID
.
-
Это значение всегда является идентификатором последней вставленной строки. Если инструкция
INSERT
запускает триггер, который вставляет строку, свойство
lastInsertRowID
содержит идентификатор последней вставленной триггером строки, а не строки, созданной инструкцией
INSERT
.
Следовательно, если вы хотите иметь явно определенный столбец первичного ключа, значение которого должно быть доступно после выполнения команды
INSERT
через свойство
SQLResult.lastInsertRowID
, столбец должен быть определен как
INTEGER PRIMARY KEY
. Даже если таблица не содержит столбец
INTEGER PRIMARY KEY
, можно также использовать созданный базой данных идентификатор строки в качестве первичного ключа таблицы для определения взаимосвязи со связанными таблицами. Значение столбца идентификатора строки доступно в любой инструкции SQL через одно из специальных имен столбцов
ROWID
,
_ROWID_
или
OID
. В связанной таблице можно создать столбец внешнего ключа и использовать значение идентификатора строки в качестве значения столбца внешнего ключа, как в случае с явно определенным столбцом
INTEGER PRIMARY KEY
. В этом случае при использовании произвольного первичного ключа вместо естественного ключа, и если вы не против создания средой выполнения значения первичного ключа, нет большой разницы в использовании столбца
INTEGER PRIMARY KEY
или идентификатора строки, созданного системой, в качестве первичного ключа таблицы для определения отношений внешнего ключа между двумя таблицами.
Дополнительные сведения о первичных ключах и генерируемых идентификаторах строк см. в разделе «
Поддержка SQL в локальных базах данных
».
|
|
|