Посмотрите на этот пример Plnkr
Переменная this
сильно отличается timesCalled
с каждым нажатием кнопки увеличивается только на 1. Ответ на мой личный вопрос:
.click( () => { } )
и
.click(function() { })
создают одинаковое количество функции при использовании в цикле, как вы можете видеть из подсчета Guid в Plnkr.
@@IDENTITY
не безопасный объем и получит Вас назад идентификатор от другой таблицы, если у Вас есть вставка, включают исходную таблицу, всегда используют SCOPE_IDENTITY()
Основанное на среде решение Oracle:
CREATE OR REPLACE PACKAGE LAST
AS
ID NUMBER;
FUNCTION IDENT RETURN NUMBER;
END;
/
CREATE OR REPLACE PACKAGE BODY LAST
AS
FUNCTION IDENT RETURN NUMBER IS
BEGIN
RETURN ID;
END;
END;
/
CREATE TABLE Test (
TestID INTEGER ,
Field1 int,
Field2 int
)
CREATE SEQUENCE Test_seq
/
CREATE OR REPLACE TRIGGER Test_itrig
BEFORE INSERT ON Test
FOR EACH ROW
DECLARE
seq_val number;
BEGIN
IF :new.TestID IS NULL THEN
SELECT Test_seq.nextval INTO seq_val FROM DUAL;
:new.TestID := seq_val;
Last.ID := seq_val;
END IF;
END;
/
To get next identity value:
SELECT LAST.IDENT FROM DUAL
Это должно работать с любым видом базы данных.
SELECT @@Scope_Identity as Id
существует также @@ идентификационные данные, но если у Вас будет триггер, они возвратят результаты чего-то, что произошло во время триггера, где scope_identity уважает Ваш объем.
Это - то, как я сделал его с помощью параметризованных команд.
MySQL
INSERT INTO MyTable (Field1, Field2) VALUES (?Value1, ?Value2);
SELECT LAST_INSERT_ID();
MSSQL INSERT INTO MyTable (Field1, Field2) VALUES (@Value1, @Value2);
SELECT SCOPE_IDENTITY();
Ответ Rob был бы самым агностическим поставщиком, но если бы Вы используете MySQL , более безопасным и корректным выбором было бы встроенное LAST_INSERT_ID()
функция.
Какую базу данных Вы используете? Насколько я знаю, нет никакого метода агностика базы данных для того, чтобы сделать это.
Помните, что @@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ возвращают последний раз созданные идентификационные данные для Вашего текущего соединения, не обязательно идентификационные данные для недавно добавленной строки в таблице. Необходимо всегда использовать SCOPE_IDENTITY () для возврата идентификационных данных недавно добавленной строки.
Для SQL 2005:
Принятие определения следующей таблицы:
CREATE TABLE [dbo].[Test](
[ID] [int] IDENTITY(1,1) NOT NULL,
[somevalue] [nchar](10) NULL,
)
можно использовать следующее:
INSERT INTO Test(somevalue)
OUTPUT INSERTED.ID
VALUES('asdfasdf')
, Который возвратит значение столбца ID.
Важное примечание - то, что использование SQL-запросов поставщика для получения последнего вставленного идентификатора безопасно использовать, не боясь о параллельных соединениях.
я всегда думал, что необходимо было создать транзакцию, чтобы ВСТАВИТЬ строку и затем ВЫБРАТЬ последний вставленный идентификатор, чтобы не получать идентификатор, вставленный другим клиентом.
, Но они поставщик определенные запросы всегда получают последний вставленный идентификатор для текущего соединения с базой данных . Это означает, что последний вставленный идентификатор не может быть затронут другими клиентскими вставками, пока они используют свое собственное соединение с базой данных.
Нет никакого стандартного способа сделать это (так же, как нет никакого стандартного способа создать идентификаторы автопостепенного увеличения). Вот два способа сделать это в PostgreSQL. Предположите, что это - Ваша таблица:
CREATE TABLE mytable (
id SERIAL PRIMARY KEY,
lastname VARCHAR NOT NULL,
firstname VARCHAR
);
можно сделать это в двух операторах, пока они - последовательные операторы в том же соединении (это будет безопасно в PHP с организацией пула подключений, потому что PHP не отдает соединение с пулом, пока сценарий не сделан):
INSERT INTO mytable (lastname, firstname) VALUES ('Washington', 'George');
SELECT lastval();
lastval () дает Вам последнее автоматически сгенерированное значение последовательности, используемое в текущем соединении.
другой путь состоит в том, чтобы использовать PostgreSQL ВОЗВРАТ , пункт на ВСТАВЛЯЕТ оператор:
INSERT INTO mytable (lastname) VALUES ('Cher') RETURNING id;
Эта форма возвращает набор результатов точно так же, как оператор SELECT и также удобна для возврата любого вида расчетного значения по умолчанию.
Если Вы работаете с Oracle:
Вставка в Таблицу (Поля....) значения (Значения...) ВОЗВРАЩАЮЩИЙСЯ (Список Полей...) В (переменные...)
пример:
ЧЕЛОВЕК INSERT INTO (ИМЯ) ОЦЕНИВАЕТ ('ДЖЕК'), ВОЗВРАЩАЮЩИЙ ID_PERSON В vIdPerson
или если Вы звоните от... Java с CallableStatement (sry, это - мое поле)
, ЧЕЛОВЕК INSERT INTO (ИМЯ) ОЦЕНИВАЕТ ('ДЖЕК'), ВОЗВРАЩАЮЩИЙ ID_PERSON В?
и объявление выходного параметра для оператора
Снова никакой ответ агностика языка, но в Java это идет как это:
Connection conn = Database.getCurrent().getConnection();
PreparedStatement ps = conn.prepareStatement(insertSql, Statement.RETURN_GENERATED_KEYS);
try {
ps.executeUpdate();
ResultSet rs = ps.getGeneratedKeys();
rs.next();
long primaryKey = rs.getLong(1);
} finally {
ps.close();
}
Это работает очень приятно в SQL 2005:
DECLARE @inserted_ids TABLE ([id] INT);
INSERT INTO [dbo].[some_table] ([col1],[col2],[col3],[col4],[col5],[col6])
OUTPUT INSERTED.[id] INTO @inserted_ids
VALUES (@col1,@col2,@col3,@col4,@col5,@col6)
Это обладает преимуществом возврата всех идентификаторов, если Ваш оператор INSERT вставляет несколько строк.
Это - то, как я делаю свои процедуры хранилища MSSQL с автоматически сгенерированным идентификатором.
CREATE PROCEDURE [dbo].[InsertProducts]
@id INT = NULL OUT,
@name VARCHAR(150) = NULL,
@desc VARCHAR(250) = NULL
AS
INSERT INTO dbo.Products
(Name,
Description)
VALUES
(@name,
@desc)
SET @id = SCOPE_IDENTITY();
Если Ваше использование PHP и MySQL, можно использовать mysql_insert_id () функция, которая скажет Вам идентификатор объекта Вы Просто instered.
, Но без Вашего Языка и DBMS я просто стреляю в темноте здесь.
sql = "INSERT INTO MyTable (Name) VALUES (@Name);" +
"SELECT CAST(scope_identity() AS int)";
SqlCommand cmd = new SqlCommand(sql, conn);
int newId = (int)cmd.ExecuteScalar();