Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 SQL запрос (INSERT) c инкрементацией ID  [new]
faustgreen
Member

Откуда:
Сообщений: 308
Таблица 1:
id name
1 Иван


Таблица 2:
id name
0 Петр
0 Дмитрий


Нужно добавить записи из таблицы 2 в таблицу 1 и при этом при добавлении каждой новой записи инкрементировать id. Может кто подскажет, как это сделать одним запросом? Пробовал сделать так:

INSERT INTO tab1(id, name);
SELECT (SELECT MAX(id)+1 FROM tab1), name FROM tab2


Получил:
id name
1 Иван
2 Петр
2 Дмитрий

а нужно:
id name
1 Иван
2 Петр
3 Дмитрий
11 янв 19, 11:38    [21782575]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос (INSERT) c инкрементацией ID  [new]
Dima T
Member

Откуда:
Сообщений: 13027
Для этого есть автоинкремент.
create cursor test( id i autoinc, name c(10))
insert into test (name) values ('Петя')
insert into test (name) values ('Вася')
brow
11 янв 19, 11:47    [21782590]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос (INSERT) c инкрементацией ID  [new]
faustgreen
Member

Откуда:
Сообщений: 308
Dima T, Это понятно, а если поле ID не с автоинкрементом? Есть ли способ?
11 янв 19, 11:52    [21782595]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос (INSERT) c инкрементацией ID  [new]
Sergej_S
Member

Откуда: Латвия
Сообщений: 268
Если скорость не принципиальна, то можно:

SELECT tab1
CALCULATE MAX(id) to nMaxId

SELECT tab2
GO TOP 
SCAN
  nMaxId = nMaxId+1
  INSERT INTO tab1 (id, name) VALUES (nMaxId, name)
ENDSCAN



Можно и покрасивее, но фокса под рукой нету, не могу проверить (возможно путаю), но типа такого:

INSERT INTO tab1 (id, name) ;
SELECT recno() +nMaxId, name FROM tab2
11 янв 19, 12:26    [21782654]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос (INSERT) c инкрементацией ID  [new]
faustgreen
Member

Откуда:
Сообщений: 308
Sergej_S, я в принципе так и делал (через scan).

По поводу :
INSERT INTO tab1 (id, name) ;
SELECT recno() +nMaxId, name FROM tab2

попробовал - не работает, результат тот же что и у меня (Fox походу это выражение вычисляет один раз и подставляет его во все строки при вставке)
11 янв 19, 12:36    [21782668]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос (INSERT) c инкрементацией ID  [new]
faustgreen
Member

Откуда:
Сообщений: 308
Упс, не сходу понял код, возможно ваш вариант и пройдет
INSERT INTO tab1 (id, name) ;
SELECT recno() +nMaxId, name FROM tab2
11 янв 19, 12:38    [21782673]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос (INSERT) c инкрементацией ID  [new]
Dima T
Member

Откуда:
Сообщений: 13027
Сделай через курсор
lnMaxId = ....
create cursor test( id i autoinc nextvalue lnMaxId, name c(10))

Сначала вставь name в курсор, они там прономеруются, затем с номерами вставляй в конечную таблицу.

Только учти что если несколько пользователей будут одновременно это делать, то будут задвония ID.
11 янв 19, 12:43    [21782685]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос (INSERT) c инкрементацией ID  [new]
faustgreen
Member

Откуда:
Сообщений: 308
Попутный вопрос про автоинкремент:
Допустим у нас есть таблица
Table
с автоинкрементным полем
id

Гарантирует ли следующий код, что функция
GetAutoIncrementValue
вернет именно то значение, которое было установлено для последней добавленной нами записи (даже если другой пользователь добавил новую запись в промежутке между выполнением команды 1 и 2):
№1 insert into table(name) values("Вася")
№2 getAutoIncremetnValue()
?
11 янв 19, 12:50    [21782697]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос (INSERT) c инкрементацией ID  [new]
faustgreen
Member

Откуда:
Сообщений: 308
У меня просто есть две таблицы:

TABLE1
id_tab1 field1
1 Вася


TABLE2
id_tab2 id_tab1 field2
1 1 Заказ1
2 1 Заказ2


Допустим поля id_tab1 и id_tab2 - автоинкрементные. Нужно сначала добавить запись в первую таблицу. А потом, например, еще 2 записи во вторую таблицу и при этом в качестве id_tab1 взять значение только что сгенерировнного id.

Такой код будет корректным ?:
insert into table1
lnId = getAutoIncrementValue() 
insert into table2 (...) values (..., lnId)
11 янв 19, 13:00    [21782712]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос (INSERT) c инкрементацией ID  [new]
Dima T
Member

Откуда:
Сообщений: 13027
Вернет id Васи. Смотри хэлп GETAUTOINCVALUE()
Возвращаемое функцией GETAUTOINCVALUE( ) последнее значение для автоинкрементного поля создается вне зависимости произошло ли реальное изменение данного поля в источнике данных. Возвращается значение =.NULL., если для заданной сессии данных еще не создано соответствующее значение автоинкрементного поля. Например, если еще не производилось никаких изменений источника данных (добавления записей), то возвращается значение =.NULL.


Но эта функция вообще не нужна, т.к.
insert into table(name) values("Вася")

переместит указатель на добавленную строку, поэтому достаточно использовать table.id
insert into table2 (...) values (..., table.id)
11 янв 19, 13:04    [21782719]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос (INSERT) c инкрементацией ID  [new]
Sergej_S
Member

Откуда: Латвия
Сообщений: 268
faustgreen
Гарантирует ли следующий код, что функция
GetAutoIncrementValue
вернет именно то значение, которое было установлено для последней добавленной нами записи (даже если другой пользователь добавил новую запись в промежутке между выполнением команды 1 и 2):
№1 insert into table(name) values("Вася")
№2 getAutoIncremetnValue()
?


Подозреваю, что вернет правильно, хотя я с автоинкрементом не работал. Почитай хелп фокса по getAutoIncremetnValue(), попробуй на практике из командного окна, открыв 2 фокса.
11 янв 19, 13:09    [21782735]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос (INSERT) c инкрементацией ID  [new]
faustgreen
Member

Откуда:
Сообщений: 308
В общем ушел тестировать, спасибо за советы!
11 янв 19, 13:17    [21782751]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить