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
// 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;
// ...