BASE1 наша БД BRAK таблица браком Добавим уникальные номера нашей табл

 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
BASE1 - наша БД
BRAK - таблица с браком
0. Добавим уникальные номера нашей таблице BRAK;
alter table add column id int not null auto_increment;
alter table drop primary key;
alter table add primary key (id);
alter table drop column UNIQSTR;
1. Разбиваем нашу объёмную траблицу на несколько мелких, с целью улучшения производительности и универсальности данных
Создадим таблицы:
post - соответствует столбцу POST BRAK - поставщик
izg - соответствует столбцу IZG BRAK - изготовитель
land - соответствует столбцу LAND BRAK - страна-производитель
lab - соответствует столбцу LABNM BRAK - лаборатория, проводившая исследование
prichina - соответствует столбцу PRICH BRAK - результат исследования
wosst - данные о восстановлении
Каждая из этих таблиц будет содержать по два столбца -
id - целый уникальный номер
name - уникальная строка
create table post (id int not null auto_increment, name varchar(50), primary key(id)); - создаём соответствующую таблицу
insert into post (name) select distinct POST from BRAK; - вставляем все возможные значения столбца поставщик в нашу таблицу, убираяя при этом повторения
С помощью этих двух команд создаём таблицы для поставщиков, изготовителей, лаборатории и причины;
Добавляем расшифровку причины:
update prichina set name='Фальсификация' where name='Ф';
update prichina set name='Брак' where name='Б';
update prichina set name='Подлинный' where name='П';
Для таблицы стран:
при просмотре значений столбца LAND BRAK мы видим, что обозначения стран не имеют единого формата и имеют большое количество опечаток
1. <Россия>, <Россия >, <"Россия">
2. <Россия/Великобритания>, <Великобритания/Россия>
3. <Беларусь>, <Республика Беларусь>
Для привидения обозначения стран к единому формату создадим следующую функцию:
create function doLand(@s varchar(26)) returns varchar(26) as begin
drop table if exists tmp
create temporary table tmp (name varchar(26))
declare @sub varchar(26)
while length(@s) != 0 begin
set @sub = substring_index(@s, '/', 1)
insert into tmp (name) values (@sub)
@s = trim(leading @sub from @s)
@s = trim(leading '/' from @s)
end
return @sub
end;
В ней мы удаляем лишние символы, нарезаем значение по символу '/' сортируем по алфавиту с помощью временной таблицы и склеиваем обратно с символом '/';
Теперь выполним команду:
insert into lands (name) select distinct doLand(LAND) from BRAK;
Для таблицы о восстановлении:
create table wosst (id int not null auto_increment, brak_id int, d_wosst date, wosst varchar(1), n_pis_wos varchar(24), primary key(id));
insert into wosst (brak_id, d_wosst, wosst, n_pis_wos) select id, D_WOSST, WOSST, N_PIS_WOS from BRAK;
Теперь все таблицы составлены и заполнены, осталось заменить значения соответствующих столбцов в BRAK на уникальные номера
update BRAK set LAND=(select id from lands where name=doLand(LAND));
update BRAK set POST=(select id from post where name=POST);
,,,
alter table BRAK change column POST POST INT;
...