![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вставка записи [D6, Paradox]
Arick © (2002-11-30 23:53:00)Господа помогите новичку с SQL.
Есть запись , номер которой (поле Number) - N
как вставить запись и занести в Number номер N+1?
Arick (2002-12-01 17:40:00) [1]Спасибо, MsGuns, просто я не знал, что autoinc и I совместимы
MsGuns (2002-12-01 15:45:00) [2]Твой случай типичный:
Гл.таблица
1. ID - autoinc Primary
Делал
1. ID - I Primary (Связь с Гл)
2. ID2 - autoinc Primary (Собств.UID)
Arick (2002-12-01 15:05:00) [3]Автоинкремент не могу использовать т.к. это полем - ключевое,
к нему присоединена вторая таблица в которой тип
не поля соединения не может быть Автоинкремент
Как бы сформировать запрос типа:
SELECT(MAX(Main.Number)+1) as M
FROM Main
INSERT
INTO Main(Number)
VALUES (M)
Но INSERT не работает.
MsGuns (2002-12-01 14:44:00) [4]Если это надо для получения уникального указателя записи, то используй Autoinc, если он не удовлетворяет, то надо определять самому. Самое простое:
var
mxnum: integer;
begin
...
Query1.SQL.Clear;
Query1.SQL.Add("SELECT MAX(Id) AS MaxNum From Table");
Query1.Prepare;
Query1.Open;
mxnum := Query1.FieldByName("MaxNum").AsInteger;
Query1.Close;
...
С последующим
Table1.Append
Table1.FieldByName("Id").AsInteger := inc(mxnum);
или
Query1.SQL.Add("INSERT INTO Table1 (Id) values("+IntToStr(inc(mxnum))+")";
Но для сетевого доступа это отстой, т.к. при попытке одновременной вставки двух юзеров для обоих будет получено ОДНО И ТО ЖЕ значение. Для парадокса можно делать добавление (Append) в цикле с защищенным блоком, в котором, если неудачно, увеличивать mxNum на 1 и в начало цикла.
Хотя в общем-то все вышеизложенное есть не что иное как собственное моделирование автоинкремента, что, ИМХО, не есть хорошо.
Arick (2002-12-01 12:57:00) [5]А как получить N?
AK-74 (2002-12-01 03:26:00) [6]Так и пиши:
Query.SQL.Clear;
Query.SQL.Add("insert into TableName (n) values (:n)");
Query.ParamByName("n").AsInteger := n + 1;
Query.ExecSQL;
Значение n из старой записи ты получаешь где-то раньше.
P.S. На всякий случай: SQL не отменяет автоинкрементные поля Paradox.