SQL - INSERT и поймать значение автоинкремента id

Здесь у вас есть ленивая оцененная версия этого алгоритма, закодированная в C #:

    static bool nextCombination(int[] num, int n, int k)
    {
        bool finished, changed;

        changed = finished = false;

        if (k > 0)
        {
            for (int i = k - 1; !finished && !changed; i--)
            {
                if (num[i] < (n - 1) - (k - 1) + i)
                {
                    num[i]++;
                    if (i < k - 1)
                    {
                        for (int j = i + 1; j < k; j++)
                        {
                            num[j] = num[j - 1] + 1;
                        }
                    }
                    changed = true;
                }
                finished = (i == 0);
            }
        }

        return changed;
    }

    static IEnumerable Combinations<T>(IEnumerable<T> elements, int k)
    {
        T[] elem = elements.ToArray();
        int size = elem.Length;

        if (k <= size)
        {
            int[] numbers = new int[k];
            for (int i = 0; i < k; i++)
            {
                numbers[i] = i;
            }

            do
            {
                yield return numbers.Select(n => elem[n]);
            }
            while (nextCombination(numbers, size, k));
        }
    }

И тестовая часть:

    static void Main(string[] args)
    {
        int k = 3;
        var t = new[] { "dog", "cat", "mouse", "zebra"};

        foreach (IEnumerable<string> i in Combinations(t, k))
        {
            Console.WriteLine(string.Join(",", i));
        }
    }

Надеюсь, это поможет вам!

16
задан Michael Myers 29 October 2010 в 19:04
поделиться

7 ответов

Это зависит от Вашего сервера базы данных. Используя MySQL, звоните mysql_insert_id() сразу после Вашего запроса на вставку. Используя PostgreSQL, сначала запросите" select nextval(seq) " на последовательности и включайте ключ в Вашем запросе на вставку.

Запросы для" select max(id) + 1 from tbl" могли перестать работать, если другой запрос вставляет запись одновременно.

16
ответ дан Matthew 30 October 2010 в 06:04
поделиться
  • 1
    Мне нравится это, потому что это также работает с n == 0. – John L 13 October 2010 в 00:56

Это зависит от механизма базы данных, который Вы используете. Некоторый DBMS, как Firebird, например, имеет пункт ВОЗВРАТА, который можно добавить к запросу. Например, если у Вас есть таблица под названием TABLE1 со столбцом автоприращения, названным идентификатором, можно использовать это:

insert into TABLE1(columns...) values (values...) returning ID;

И это возвратило бы вставленный идентификатор точно так же, как регулярный избранный оператор.

3
ответ дан Milan Babuškov 30 October 2010 в 06:04
поделиться
  • 1
    @TomMD you' право ре, моя ошибка. Я думал о различном определении с помощью iterate, который isn' t почти столь же хороший как что Вы обеспечили. – John L 13 October 2010 в 04:08

В php: mysql_insert_id () http://us3.php.net/mysql_insert_id

или

, Если Вы хотели к genterate число от своего mySql запроса Select, Вы могли бы использовать этот РЕДАКТИРОВАНИЕ:

SELECT LAST_INSERT_ID(`1`) + 1 FROM table 
0
ответ дан superUntitled 30 October 2010 в 06:04
поделиться

В Microsoft Transact SQL вы можете использовать @@ IDENTITY.

например

DECLARE @Table TABLE ( col0 INT IDENTITY, col1 VARCHAR(255), col2 VARCHAR(255))

INSERT INTO @Table (col1, col2) VALUES ('Hello','World!')

SELECT @@Identity

SELECT * FROM @Table
2
ответ дан 30 November 2019 в 21:11
поделиться

Будьте очень осторожны: очевидно, что select nextval (seq) не работает при высоком параллелизме - какое-то другое соединение может вставляться между моментом, когда вы вставили, и временем, когда вы вызывали select nextval (seq). Всегда тестируйте такой код с помощью средств тестирования с высокой степенью параллелизма.

0
ответ дан 30 November 2019 в 21:11
поделиться

В SQL Server вставка с использованием оператора select может иметь предложение вывода, которое будет возвращать значение идентификатора и любые другие столбцы, которые могут вам понадобиться, чтобы определить, какой идентификатор относится к какой записи. Если вы используете предложение значений, используйте select scope_identity () сразу после вставки.

0
ответ дан 30 November 2019 в 21:11
поделиться

В postgres лучший способ сделать что-то вроде:

insert into foos(name) values ('my_foo') returning id;
7
ответ дан 30 November 2019 в 21:11
поделиться
Другие вопросы по тегам:

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