powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / INSERT INTO ON EXISTING UPDATE- баг или...
10 сообщений из 10, страница 1 из 1
INSERT INTO ON EXISTING UPDATE- баг или...
    #33027802
VadimS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сервер ASA 9.02.3044
Отрабатывем такой код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
CREATE TABLE "DBA"."test" (
	"id" integer NOT NULL ,
	"Sum1" numeric( 15 , 2 ) NULL,
	"Sum2" numeric( 15 , 2 ) NULL,
	PRIMARY KEY ( "id" )
);

//Добавим записи с SUM1
insert into test(id,sum1)
select  1 , 11 . 11 
union all
select  2 , 22 . 11 
union all
select  5 , 55 . 11 
union all
select  6 , 66 . 11 

commit;

//Добавим - изменим записи с SUM2

Insert into test(id,sum2)
	 ON EXISTING UPDATE
Select  1 , 1 . 22 
union all
select  5 , 555 . 22 
union all
Select  3 , 33 . 22 
union all
select  2 , 222 . 22 

commit;
select * from test order by id

В итоге получается:

Код: plaintext
1.
2.
3.
4.
5.
6.
id	Sum1	Sum2
1	11,11	1,22
2	22,11	222,22
3	NULL	33,22
 5	NULL	555,22 
6	66,11  NULL
А по идее должно получится
Код: plaintext
1.
2.
3.
4.
5.
6.
id	Sum1	Sum2
1	11,11	1,22
2	22,11	222,22
3	NULL	33,22
 5	55,11	555,22 
6	66,11  NULL

Если поменять строку вставки местами:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Insert into test(id,sum2)
	 ON EXISTING UPDATE
Select  1 , 1 . 22 
union all
Select  3 , 33 . 22 
union all
select  5 , 555 . 22 
union all
select  2 , 222 . 22 
то все нормально. Но ведь так не должно быть?
Эта Баг?
...
Рейтинг: 0 / 0
INSERT INTO ON EXISTING UPDATE- баг или...
    #33027938
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VadimSНо ведь так не должно быть?
Эта Баг?
Скорее всего, да. На фичу не тянет, особенно с учётом того, что от изменения порядка строк меняется результат. Пиши авторам...
...
Рейтинг: 0 / 0
INSERT INTO ON EXISTING UPDATE- баг или...
    #33027957
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ваш запрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Insert into test(id,sum2)
	 ON EXISTING UPDATE
Select  1 , 1 . 22 
union all
select  5 , 555 . 22 
union all
Select  3 , 33 . 22 
union all
select  2 , 222 . 22 
получается эквивалентен запросу:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Insert into test(id,sum1, sum2)
	 ON EXISTING UPDATE
Select  1 ,NULL, 1 . 22 
union all
select  5 ,NULL, 555 . 22 
union all
Select  3 ,NULL, 33 . 22 
union all
select  2 ,NULL, 222 . 22 
Никто не обещал в конструкции INSERT ON EXISTING UPDATE обьединение колонок, на существующие записи идет полный UPDATE всех колонок, кроме полей PK. Соотвествующе пропущенные колонки далее приравниваются к NULL (Хотя Брек Картер помниться спорил с разработчиками по поводу, не должно ли в таком случае присваивается значение с DEFAULT). Так что никаких багов в данном случае (вернее они есть, за последние 2 дня еще парочку себе в список добавил, но чтобы их воспроизвести нужно еще хорошо постараться).
...
Рейтинг: 0 / 0
INSERT INTO ON EXISTING UPDATE- баг или...
    #33027992
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гм, сорри, действтельно баг в список, видимо уже включаются вечерние тормоза.
...
Рейтинг: 0 / 0
INSERT INTO ON EXISTING UPDATE- баг или...
    #33028028
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Круто ! А еще какие-нибудь фичи вроде
Insert into ... ON EXISTING UPDATE
есть в ASA?
...
Рейтинг: 0 / 0
INSERT INTO ON EXISTING UPDATE- баг или...
    #33028030
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Баг связан с UNION ALL и DUMMY судя по всему. Например такой код отрабатывает корректно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
//Добавим - изменим записи с SUM2
INSERT INTO test(id,sum2) ON EXISTING UPDATE
  SELECT id, sum1 +  0 . 1 
  FROM Test
  WHERE id IN ( 1 , 2 , 5 )
  UNION ALL
  SELECT  3 , 33 . 22 ;

SELECT *
FROM Test;
idSum1Sum2111.1111.21222.1122.213NULL33.22555.1155.21666.11NULL

P.S. Я почему то всегда думал, что такая конструкция INSERT будет апдейтить все поля вне зависимости от того, что было указанно. Оказалось, что это не так, век живи, век учись - хотя я вряд ли рискну проводить такой "UPDATE" без явного указания всех полей :)
...
Рейтинг: 0 / 0
INSERT INTO ON EXISTING UPDATE- баг или...
    #33028062
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivКруто ! А еще какие-нибудь фичи вроде
Insert into ... ON EXISTING UPDATE
есть в ASA?
Ну дык - Common Table Expression, рекурсивные запросы, пользовательские глобальные сессионные переменные, временные сессионные опции БД, ХП-события (обработка подключений, отключений, разных ситуаций БД), включение ХП на инициализацию сессии при ее подключении (с возможностью сгенерить ошибку и не дать сессии подключится), область видимости локальных переменных в скриптах, OLAP функции (аггрегации, нарастающие по разрезам и т.д.), BEFORE триггера с возможностью инициализации или изменения в них полей при вставке или обновлении записей, глобальные сессионные временные таблицы, где описание их лежит в БД, а каждая сессия имеет свой набор данных и видит их сразу же после подключения, хранение и обработка стрингов до 2гб, шустрый динамический SQL, ну и т.д. и т.п. - сильно много писать, если сравнивать с тем же MSSQL. В общем мне нравиться :)
...
Рейтинг: 0 / 0
INSERT INTO ON EXISTING UPDATE- баг или...
    #33028136
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSдействтельно баг в список
А список - авторам, в красивой коробочке, перевязанной красной ленточкой :)? Мне, похоже, проще - я их нахожу не так много для того, чтобы составлять список (поэтому осчастливливаю авторов немедленно ).
...
Рейтинг: 0 / 0
INSERT INTO ON EXISTING UPDATE- баг или...
    #33028442
VadimS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSБаг связан с UNION ALL и DUMMY судя по всему.
Union all приведен в качестве примера.
На самом деле запрос сложнее: Идет обьединение данных из двух разных таблиц с разными условиями.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Insert into table1(id,Sum1,...)
Select ...
From Table2 Where ...

Insert into table1(id,Sum2,...)
   ON EXISTING UPDATE
Select ...
From Table3 Where ...

...
Рейтинг: 0 / 0
INSERT INTO ON EXISTING UPDATE- баг или...
    #33028476
VadimS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно изменить пример - добавим поле ID2:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE "DBA"."test" (
	"id" integer NOT NULL,
	"Sum1" numeric( 15 , 2 ) NULL,
	"Sum2" numeric( 15 , 2 ) NULL,
	"Id2" integer NOT NULL DEFAULT autoincrement UNIQUE,
	PRIMARY KEY ( "id" )
);
И при команде:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
truncate table test;
insert into test(id,sum1)
select  1 , 11 . 11 
union all
select  2 , 22 . 11 
union all
select  5 , 55 . 11 
union all
select  6 , 66 . 11 

commit;

Insert into test(id,sum2)
	 ON EXISTING UPDATE
Select  1 , 1 . 22 
union all
select  5 , 555 . 22 
union all
Select  3 , 33 . 22 
union all
select  2 , 222 . 22 
commit;

select * from test order by id
Сервер ругается на неуникальность Id2.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / INSERT INTO ON EXISTING UPDATE- баг или...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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