SQL: Как получить идентификатор значений, которые я просто ВСТАВИЛ?

Посмотрите на этот пример Plnkr

Переменная this сильно отличается timesCalled с каждым нажатием кнопки увеличивается только на 1. Ответ на мой личный вопрос:

.click( () => { } )

и

.click(function() { })

создают одинаковое количество функции при использовании в цикле, как вы можете видеть из подсчета Guid в Plnkr.

75
задан a_horse_with_no_name 14 October 2013 в 16:41
поделиться

17 ответов

@@IDENTITY не безопасный объем и получит Вас назад идентификатор от другой таблицы, если у Вас есть вставка, включают исходную таблицу, всегда используют SCOPE_IDENTITY()

56
ответ дан Soner Gönül 24 November 2019 в 11:35
поделиться

Основанное на среде решение 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
0
ответ дан 24 November 2019 в 11:35
поделиться
  1. вставляют строку с известным гуидом.
  2. выбирают autoId-поле с этим гуидом.

Это должно работать с любым видом базы данных.

0
ответ дан dummy 24 November 2019 в 11:35
поделиться
SELECT @@Scope_Identity as Id

существует также @@ идентификационные данные, но если у Вас будет триггер, они возвратят результаты чего-то, что произошло во время триггера, где scope_identity уважает Ваш объем.

0
ответ дан DevelopingChris 24 November 2019 в 11:35
поделиться

Это - то, как я сделал его с помощью параметризованных команд.

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(); 

2
ответ дан Wyck Hebert 24 November 2019 в 11:35
поделиться

Ответ Rob был бы самым агностическим поставщиком, но если бы Вы используете MySQL , более безопасным и корректным выбором было бы встроенное LAST_INSERT_ID() функция.

1
ответ дан Tobias Baaz 24 November 2019 в 11:35
поделиться

Какую базу данных Вы используете? Насколько я знаю, нет никакого метода агностика базы данных для того, чтобы сделать это.

2
ответ дан Matthew Watson 24 November 2019 в 11:35
поделиться

Помните, что @@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ возвращают последний раз созданные идентификационные данные для Вашего текущего соединения, не обязательно идентификационные данные для недавно добавленной строки в таблице. Необходимо всегда использовать SCOPE_IDENTITY () для возврата идентификационных данных недавно добавленной строки.

2
ответ дан Espo 24 November 2019 в 11:35
поделиться

Для 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.

3
ответ дан NotMe 24 November 2019 в 11:35
поделиться

Важное примечание - то, что использование SQL-запросов поставщика для получения последнего вставленного идентификатора безопасно использовать, не боясь о параллельных соединениях.

я всегда думал, что необходимо было создать транзакцию, чтобы ВСТАВИТЬ строку и затем ВЫБРАТЬ последний вставленный идентификатор, чтобы не получать идентификатор, вставленный другим клиентом.

, Но они поставщик определенные запросы всегда получают последний вставленный идентификатор для текущего соединения с базой данных . Это означает, что последний вставленный идентификатор не может быть затронут другими клиентскими вставками, пока они используют свое собственное соединение с базой данных.

4
ответ дан Vincent Robert 24 November 2019 в 11:35
поделиться

Нет никакого стандартного способа сделать это (так же, как нет никакого стандартного способа создать идентификаторы автопостепенного увеличения). Вот два способа сделать это в 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 и также удобна для возврата любого вида расчетного значения по умолчанию.

6
ответ дан Neall 24 November 2019 в 11:35
поделиться

Если Вы работаете с Oracle:

Вставка в Таблицу (Поля....) значения (Значения...) ВОЗВРАЩАЮЩИЙСЯ (Список Полей...) В (переменные...)

пример:

ЧЕЛОВЕК INSERT INTO (ИМЯ) ОЦЕНИВАЕТ ('ДЖЕК'), ВОЗВРАЩАЮЩИЙ ID_PERSON В vIdPerson

или если Вы звоните от... Java с CallableStatement (sry, это - мое поле)

, ЧЕЛОВЕК INSERT INTO (ИМЯ) ОЦЕНИВАЕТ ('ДЖЕК'), ВОЗВРАЩАЮЩИЙ ID_PERSON В?

и объявление выходного параметра для оператора

8
ответ дан Telcontar 24 November 2019 в 11:35
поделиться

Снова никакой ответ агностика языка, но в 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();  
}  
11
ответ дан Slartibartfast 24 November 2019 в 11:35
поделиться

Это работает очень приятно в 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 вставляет несколько строк.

14
ответ дан Daniel Schaffer 24 November 2019 в 11:35
поделиться

Это - то, как я делаю свои процедуры хранилища 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();
29
ответ дан David Basarab 24 November 2019 в 11:35
поделиться

Если Ваше использование PHP и MySQL, можно использовать mysql_insert_id () функция, которая скажет Вам идентификатор объекта Вы Просто instered.
, Но без Вашего Языка и DBMS я просто стреляю в темноте здесь.

14
ответ дан UnkwnTech 24 November 2019 в 11:35
поделиться
sql = "INSERT INTO MyTable (Name) VALUES (@Name);" +
      "SELECT CAST(scope_identity() AS int)";
SqlCommand cmd = new SqlCommand(sql, conn);
int newId = (int)cmd.ExecuteScalar();
2
ответ дан 24 November 2019 в 11:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: