powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / SQL запрос (INSERT) c инкрементацией ID
16 сообщений из 16, страница 1 из 1
SQL запрос (INSERT) c инкрементацией ID
    #39758349
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблица 1:
id name 1 Иван

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

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

Код: sql
1.
2.
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 Дмитрий
...
Рейтинг: 0 / 0
SQL запрос (INSERT) c инкрементацией ID
    #39758359
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для этого есть автоинкремент.
Код: sql
1.
2.
3.
4.
create cursor test( id i autoinc, name c(10))
insert into test (name) values ('Петя')
insert into test (name) values ('Вася')
brow
...
Рейтинг: 0 / 0
SQL запрос (INSERT) c инкрементацией ID
    #39758363
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, Это понятно, а если поле ID не с автоинкрементом? Есть ли способ?
...
Рейтинг: 0 / 0
SQL запрос (INSERT) c инкрементацией ID
    #39758378
Sergej_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если скорость не принципиальна, то можно:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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
...
Рейтинг: 0 / 0
SQL запрос (INSERT) c инкрементацией ID
    #39758381
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergej_S, я в принципе так и делал (через scan).

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


попробовал - не работает, результат тот же что и у меня (Fox походу это выражение вычисляет один раз и подставляет его во все строки при вставке)
...
Рейтинг: 0 / 0
SQL запрос (INSERT) c инкрементацией ID
    #39758383
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Упс, не сходу понял код, возможно ваш вариант и пройдет
Код: sql
1.
2.
INSERT INTO tab1 (id, name) ;
SELECT recno() +nMaxId, name FROM tab2
...
Рейтинг: 0 / 0
SQL запрос (INSERT) c инкрементацией ID
    #39758389
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделай через курсор
Код: sql
1.
2.
lnMaxId = ....
create cursor test( id i autoinc nextvalue lnMaxId, name c(10))


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

Только учти что если несколько пользователей будут одновременно это делать, то будут задвония ID.
...
Рейтинг: 0 / 0
SQL запрос (INSERT) c инкрементацией ID
    #39758393
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попутный вопрос про автоинкремент:
Допустим у нас есть таблица
Код: sql
1.
Table

с автоинкрементным полем
Код: sql
1.
id


Гарантирует ли следующий код, что функция
Код: sql
1.
GetAutoIncrementValue

вернет именно то значение, которое было установлено для последней добавленной нами записи (даже если другой пользователь добавил новую запись в промежутке между выполнением команды 1 и 2):
Код: sql
1.
2.
№1 insert into table(name) values("Вася")
№2 getAutoIncremetnValue()

?
...
Рейтинг: 0 / 0
SQL запрос (INSERT) c инкрементацией ID
    #39758398
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня просто есть две таблицы:

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.

Такой код будет корректным ?:
Код: sql
1.
2.
3.
insert into table1
lnId = getAutoIncrementValue() 
insert into table2 (...) values (..., lnId)
...
Рейтинг: 0 / 0
SQL запрос (INSERT) c инкрементацией ID
    #39758401
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вернет id Васи. Смотри хэлп GETAUTOINCVALUE()
Возвращаемое функцией GETAUTOINCVALUE( ) последнее значение для автоинкрементного поля создается вне зависимости произошло ли реальное изменение данного поля в источнике данных. Возвращается значение =.NULL., если для заданной сессии данных еще не создано соответствующее значение автоинкрементного поля. Например, если еще не производилось никаких изменений источника данных (добавления записей), то возвращается значение =.NULL.

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


переместит указатель на добавленную строку, поэтому достаточно использовать table.id
Код: sql
1.
insert into table2 (...) values (..., table.id)
...
Рейтинг: 0 / 0
SQL запрос (INSERT) c инкрементацией ID
    #39758406
Sergej_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreenГарантирует ли следующий код, что функция
Код: sql
1.
GetAutoIncrementValue

вернет именно то значение, которое было установлено для последней добавленной нами записи (даже если другой пользователь добавил новую запись в промежутке между выполнением команды 1 и 2):
Код: sql
1.
2.
№1 insert into table(name) values("Вася")
№2 getAutoIncremetnValue()

?

Подозреваю, что вернет правильно, хотя я с автоинкрементом не работал. Почитай хелп фокса по getAutoIncremetnValue(), попробуй на практике из командного окна, открыв 2 фокса.
...
Рейтинг: 0 / 0
SQL запрос (INSERT) c инкрементацией ID
    #39758416
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем ушел тестировать, спасибо за советы!
...
Рейтинг: 0 / 0
SQL запрос (INSERT) c инкрементацией ID
    #39770073
alboro73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лучше поздно, чем никогда. Это кстати самое главное преимущество фокса. ....
Поле должно быть индексировано(лучше заранее).
INDEX ON id TAG id
Предварительно можно зафиксировать статус-кво по SET NEAR и SET ORDE
m.NEAR_=SET("NEAR")
m.ORDE_=SET("ORDE")
Берем max. значение для поля(например для 5-ти значного 99999).
Вкл.мягкий поиск
SET NEAR ON
Вкл. поиск по убыванию.
SET ORDE TO id DESC
SEEK 99999
Стали на запись с max-значением
m.IDMAX=table.id
Верните статус-кво
SET NEAR &m.NEAR_
SET ORDE &m.ORDE_

Добавляйте(вставляйте) запись с table.id=m.IDMAX+1
И не надо циклов со SCAN/WHILE. Кстати, из опыта цикл по WHILE выполняется быстрее
...
Рейтинг: 0 / 0
SQL запрос (INSERT) c инкрементацией ID
    #39771078
Березовский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Велосипедистам привет.

Смотрите штатный пример в фоксе- Solution.pjx

База данных newsid- показан простой способ генерации id
в хранимой процедуре БД
...
Рейтинг: 0 / 0
SQL запрос (INSERT) c инкрементацией ID
    #39771101
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БерезовскийВелосипедистам привет.

Смотрите штатный пример в фоксе- Solution.pjx

База данных newsid- показан простой способ генерации id
в хранимой процедуре БД
Привет, археолог. Это было актуально до появления полей с AUTOINC
...
Рейтинг: 0 / 0
SQL запрос (INSERT) c инкрементацией ID
    #39771107
Березовский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так тут конкретный вопрос
авторDima T, Это понятно, а если поле ID не с автоинкрементом? Есть ли способ?
про +1
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / SQL запрос (INSERT) c инкрементацией ID
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]