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

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

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

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

Код: plsql
1.
2.
3.
4.
5.
6.
7.
ALTER TABLE SPOST ADD CONSTRAINT SPOST_PK PRIMARY KEY (ID);
/*
Тут:
 SPOST    - имя таблицы
 SPOST_PK - наименование ограничения, что бы потом можно было ссылаться на него по имени, 
            ну и вообще, удобно из названия ограничения понимать что это такое 
*/
...
Рейтинг: 0 / 0
IBExpert. Добавить Primary key в таблицу с данными.
    #39900558
Explosion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пишу:
Код: 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
IBExpert. Добавить Primary key в таблицу с данными.
    #39900561
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Триггер на заполнение 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
IBExpert. Добавить Primary key в таблицу с данными.
    #39900565
Explosion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проверил:
- поле 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
IBExpert. Добавить Primary key в таблицу с данными.
    #39900581
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попытался для автора сделать воспроизводимый тест, однако уперся в ту же самую ошибку что и у автора.
Вывод - в 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
IBExpert. Добавить Primary key в таблицу с данными.
    #39900587
Explosion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В этом и проблема. Это и есть таблица-клон. Оригинал таблицы был создан прошлым программистом с первичным ключом DISP_GROUP (праймори кей = текстовое поле =]).
...
Рейтинг: 0 / 0
IBExpert. Добавить Primary key в таблицу с данными.
    #39900589
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraks,

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

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


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

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

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


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