Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / IBExpert. Добавить Primary key в таблицу с данными. / 17 сообщений из 17, страница 1 из 1
09.12.2019, 15:48
    #39900102
Explosion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBExpert. Добавить Primary key в таблицу с данными.
Здравствуйте. Существует таблица с забитыми данными, мне необходимо завести новое поле ID и сделать его первичным. Создаю данное поле, жмакую галочку на Primary key, выбираю тип integer и соответственно при создании такого поля выскакивает ошибка, так как значения не могут быть null.
Пробовал создать поле ID без указания первички, генератором заполнил пустые значения, но после данных действий пропадает возможность в данном поле поставить галочку Primary Key.
С IBExpert сталкиваюсь редко, подскажите как быть.
...
Рейтинг: 0 / 0
09.12.2019, 15:55
    #39900116
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBExpert. Добавить Primary key в таблицу с данными.
добавляешь поле (без NOT NULL)
инициализируешь его нужными значениями.
альтеришь поле (ставишь признак NOT NULL)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.12.2019, 16:02
    #39900124
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBExpert. Добавить Primary key в таблицу с данными.
Explosion,

учите SQL (DDL в частности).
В IBE первичный ключ можно добавить позже на закладки "ограничения".
...
Рейтинг: 0 / 0
09.12.2019, 21:58
    #39900466
Старый плюшевый мишка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBExpert. Добавить Primary key в таблицу с данными.
Не, ну я так не играю. Альтеры всякие, адды... Что, трудно сказать какую галку нажмакнуть?
...
Рейтинг: 0 / 0
09.12.2019, 22:10
    #39900474
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBExpert. Добавить Primary key в таблицу с данными.
Старый плюшевый мишка,

сказать трудно, надо нарисовать )
...
Рейтинг: 0 / 0
09.12.2019, 22:39
    #39900479
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBExpert. Добавить Primary key в таблицу с данными.
Симонов Денис
Старый плюшевый мишка,

сказать трудно, надо нарисовать )
ты отстал от тренда - трэба запостить видосик!
...
Рейтинг: 0 / 0
09.12.2019, 23:20
    #39900490
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBExpert. Добавить Primary key в таблицу с данными.
Добавление первичного ключа делается командой:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
ALTER TABLE SPOST ADD CONSTRAINT SPOST_PK PRIMARY KEY (ID);
/*
Тут:
 SPOST    - имя таблицы
 SPOST_PK - наименование ограничения, что бы потом можно было ссылаться на него по имени, 
            ну и вообще, удобно из названия ограничения понимать что это такое 
*/
...
Рейтинг: 0 / 0
10.12.2019, 07:08
    #39900558
Explosion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBExpert. Добавить Primary key в таблицу с данными.
Пишу:
Код: sql
1.
ALTER TABLE h_mkb_disp ADD CONSTRAINT PK_H_MKB_DISP_ID PRIMARY KEY (ID);



Выскакивает ошибка: The insert failed because a column definition includes validation constraints.
validation error for column ID, value "*** null ***".

Прошелся по форуму:
https://www.sql.ru/forum/939734/problema-s-insert-na-primary-key-validation-error-for-column-value-null
Вроде как дело в не созданом автоинкрименте. Создал генератор. На триггер вставки повесил такой код:
Код: sql
1.
2.
3.
4.
5.
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GEN_H_MKB_DISP_ID,1);
END


По прежнему ругается.
Когда делаю через вкладку costraint, аналогичная ошибка.
...
Рейтинг: 0 / 0
10.12.2019, 07:27
    #39900561
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBExpert. Добавить Primary key в таблицу с данными.
Триггер на заполнение ID - это хорошо. Но он будет срабатывать только при вставке записи.

Прежде чем объявить поле первичным ключом нужно что бы данные уже в нем находящиеся - соответствовали требованиям первичного ключа.

- в поле ID не должно быть значений NULL
- в поле ID не должно быть повторяющихся значений

Только приведя данные в поле к этим требованиям, можно навешивать ограничение NOT NULL и объявлять первичный ключ.

Если не ошибаюсь, то сообщение об ошибке говорит что в поле ID присутствует NULL.

Поискать такие значения можно запросом
Код: plsql
1.
2.
3.
select * 
from h_mkb_disp
where (id is NULL)



ну а что бы мы тут меньше гадали про вашу ситуацию - приведите сюда скрипт таблицы, из IBExpert, с вкладки "Скрипт". Весь.
Начинается он так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
/******************************************************************************/
/***                Generated by IBExpert 10.12.2019 3:15:05                ***/
/******************************************************************************/

/******************************************************************************/
/***      Following SET SQL DIALECT is just for the Database Comparer       ***/
/******************************************************************************/
SET SQL DIALECT 3;



/******************************************************************************/
/***                                 Tables                                 ***/
/******************************************************************************/


CREATE GENERATOR GEN_SPOST_NM;

CREATE TABLE SPOST (
    ID              INTEGER NOT NULL,
...
Рейтинг: 0 / 0
10.12.2019, 07:50
    #39900565
Explosion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBExpert. Добавить Primary key в таблицу с данными.
Проверил:
- поле ID проставлено как not null;
- в поле ID нет повторяющихся значений;
- в поле ID нет пустых значений.

Скрипт:
Код: sql
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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
/******************************************************************************/
/***                Generated by IBExpert 10.12.2019 9:47:04                ***/
/******************************************************************************/

/******************************************************************************/
/***      Following SET SQL DIALECT is just for the Database Comparer       ***/
/******************************************************************************/
SET SQL DIALECT 3;



/******************************************************************************/
/***                                 Tables                                 ***/
/******************************************************************************/


CREATE GENERATOR GEN_H_MKB_DISP_ID;

CREATE TABLE H_MKB_DISP (
    GROUP_DISP      DM_CHAR_20 /* DM_CHAR_20 = VARCHAR(20) */,
    PARENT_ID       DM_CHAR_10 /* DM_CHAR_10 = VARCHAR(10) */,
    TITLE           DM_CHAR_250 /* DM_CHAR_250 = VARCHAR(250) */,
    DLEFT           DM_CHAR_10 /* DM_CHAR_10 = VARCHAR(10) */,
    DRIGHT          DM_CHAR_10 /* DM_CHAR_10 = VARCHAR(10) */,
    ORDR            DM_INT /* DM_INT = INTEGER */,
    GROUP_ID        DM_CHAR_250 /* DM_CHAR_250 = VARCHAR(250) */,
    IS_DISP         DM_INT /* DM_INT = INTEGER */,
    GROUP_NOSOLOGY  SMALLINT,
    ID              INTEGER NOT NULL
);




/******************************************************************************/
/***                                Triggers                                ***/
/******************************************************************************/


SET TERM ^ ;



/******************************************************************************/
/***                          Triggers for tables                           ***/
/******************************************************************************/



/* Trigger: H_MKB_DISP_BI0 */
CREATE OR ALTER TRIGGER H_MKB_DISP_BI0 FOR H_MKB_DISP
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GEN_H_MKB_DISP_ID,1);
END
^


SET TERM ; ^



/******************************************************************************/
/***                          Fields descriptions                           ***/
/******************************************************************************/

COMMENT ON COLUMN H_MKB_DISP.GROUP_ID IS 
'Код группы (через ЗПТ и в кавычках, например "СЗ","Другое"):
СЗЗ - социально-значимые заболевания';



/******************************************************************************/
/***                               Privileges                               ***/
/******************************************************************************/
...
Рейтинг: 0 / 0
10.12.2019, 08:32
    #39900581
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBExpert. Добавить Primary key в таблицу с данными.
Попытался для автора сделать воспроизводимый тест, однако уперся в ту же самую ошибку что и у автора.
Вывод - в Firebird-2.5.8-32 (который у меня стоит) объявить первичный ключ на таблице с данными невозможно.
Команда alter table выдает ошибку:

авторThe insert failed because a column definition includes validation constraints.
validation error for column ID, value "*** null ***".


Попытка объявить первичный ключ гуевыми средствами IBExpert заканчивается ровно тем же, по той же самой причине - IBexpert дает ту же самую команду.

Скрипт теста:
Код: plsql
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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
create table test (
name varchar(20)
);

insert into test(name) values('первая');
insert into test(name) values('вторая');
insert into test(name) values('третья');
insert into test(name) values(NULL);
commit;

-- добавляем поле ID NOT NULL
-- NOT NULL - нужно для первичного ключа
-- изменить поле потом, с NULLable на NOT NULL в версии Firebird 2.5 невозможно
-- однако нужно понимать что добавление поля NOT NULL к таблице с данными
-- без заполнения этого поля, сделает бэкап этой базы невосстановимым
alter table test add id integer not null;

-- создаем генератор
create generator gen_test_id;

-- создаем триггер
-- срабатывает он на insert и на update (что бы заполнить пустые поля)
SET TERM ^ ;

CREATE OR ALTER TRIGGER TEST_BI FOR TEST
ACTIVE BEFORE INSERT OR UPDATE POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gen_test_id,1);
end
^

SET TERM ; ^

-- заполним поле ID из генератора
update test
set name = name
;
commit;

-- добавим первичный ключ
alter table test add constraint test_pk primary key (id);

-- И тут же получаем вот такую ошибку
/*
The insert failed because a column definition includes validation constraints.
validation error for column ID, value "*** null ***".
*/

-- НЕ ПРОКАНАЛО



Что делать.

Если у таблицы нет связей, то я был создал клон таблицы, сразу с первичным ключом, заполнил бы данными из исходной, при этом ID заполнился бы из генератора. Ну и потом грохнул бы исходную, воссоздал обратно с нужными полями и первичным ключом, и перелил данные обратно.
...
Рейтинг: 0 / 0
10.12.2019, 09:04
    #39900587
Explosion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBExpert. Добавить Primary key в таблицу с данными.
В этом и проблема. Это и есть таблица-клон. Оригинал таблицы был создан прошлым программистом с первичным ключом DISP_GROUP (праймори кей = текстовое поле =]).
...
Рейтинг: 0 / 0
10.12.2019, 09:12
    #39900589
m7m
m7m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBExpert. Добавить Primary key в таблицу с данными.
fraks,

на WI-V6.3.6.27020 Firebird 2.5
твой скрипт прошел без проблем
...
Рейтинг: 0 / 0
10.12.2019, 09:25
    #39900597
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBExpert. Добавить Primary key в таблицу с данными.
У меня fbserver.exe версии 2.5.8.27089
...
Рейтинг: 0 / 0
10.12.2019, 10:07
    #39900630
demon1992
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBExpert. Добавить Primary key в таблицу с данными.
У меня частенько было так, когда пытался unique ограничения навешивать на таблицы, так же ругался сервер что есть повторяющиеся значения, хотя я их убрал. Я думаю это из за старых версий записей, в которых были ранее значения null.
Сделай sweep, и еще раз выполни команду по созданию PK.
...
Рейтинг: 0 / 0
10.12.2019, 10:31
    #39900651
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBExpert. Добавить Primary key в таблицу с данными.
В моем скрипте после update сделал реконнект - и первичный ключ на таблице с данными создался.

Точнее говоря команда
Код: plsql
1.
2.
-- добавим первичный ключ
alter table test add constraint test_pk primary key (id);


выполнилась без ошибок.

Видимо действительно версии записей мешали.
...
Рейтинг: 0 / 0
10.12.2019, 12:15
    #39900732
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBExpert. Добавить Primary key в таблицу с данными.
fraks,

ребята, ну вы чего? Индекс создается по всем существующим на данный момент в таблице версиям. Поэтому пока старые версии с null не убраны как мусор, индекс (pk, unique) не создастся, он будет видеть эти самые версии с null.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / IBExpert. Добавить Primary key в таблицу с данными. / 17 сообщений из 17, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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