Была таблица со следующей структурой:
CREATE TABLE `table` (
`id` smallint(5) UNSIGNED NOT NULL,
`get_url` varchar(120) COLLATE utf8_unicode_ci NOT NULL,
`code_collection` varchar(13) COLLATE utf8_unicode_ci NOT NULL,
`download_url` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`storage` varchar(90) COLLATE utf8_unicode_ci NOT NULL,
`location` varchar(130) COLLATE utf8_unicode_ci NOT NULL,
`width` smallint(4) NOT NULL,
`height` smallint(4) NOT NULL,
`username` varchar(120) COLLATE utf8_unicode_ci NOT NULL,
`time` int(10) NOT NULL,
`size` varchar(8) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Всего там 800к записей общим объемом 250 мегабайт.
Дамп данных(одна строка):
INSERT INTO `table` (`id`, `get_url`, `code_collection`, `download_url`, `storage`, `location`, `width`, `height`, `username`, `time`, `size`)
VALUES (
1,
'https://vk.com/photo-37586128_456243663',
'-37586128_456243663',
'https://pp.userapi.com/c844724/v844724022/182b9d/kRmYTHG7eGQ.jpg',
'elegantstroy',
'Парк победы',
864,
1080,
'elegantstroy',
1915933675, '223.54');
ALTER TABLE `table` ADD PRIMARY KEY (`id`);
В общем нужно не изменяя имени таблицы добавить туда 3-4 новых поля и заменить поля username на username_id, storage на storage_id и location на location_id. Но так как данные username,storage,location были строками. а теперь им нужно быть идентификаторами( юзеров, хранилищ и локаций ) были созданы следующие таблицы:
CREATE TABLE `usernames` (
`id` smallint(5) UNSIGNED NOT NULL,
`username` varchar(120) COLLATE utf8_unicode_ci NOT NULL,
`time` int(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE `storages` (
`id` smallint(5) UNSIGNED NOT NULL,
`storage` varchar(120) COLLATE utf8_unicode_ci NOT NULL,
`time` int(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE `locations` (
`id` smallint(5) UNSIGNED NOT NULL,
`location` varchar(120) COLLATE utf8_unicode_ci NOT NULL,
`time` int(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
То есть нужно данные из тех полей перенести в эти новые таблицы, а в основную таблицу вставить уже идентификаторы, соответствующие этим данным( ясное дело без дубликатов в новые таблицы надо вставить )
И тогда изменится сам процесс вставки данных в основную таблицу.
Было:
$sql = "INSERT INTO `table` (`get_url`,`code_collection`,`download_url`,`storage`,`location`,`width`,`height`,`username`,`time`,`size`)
VALUES ('".$clearUrl."','".$code."','".$download_url."','".$storage."','".$location."','".$width."','".$height."','".$username."','".$time."','".$size."')";
В новом запросе уже username,location и storage вставлять в свои таблицы и в основную вставлять только возвращаемые id, соответствено код будет таким:
//получаем Id
$storageId = functAddStorageInDb( $storage );
$usernameId = functAddUsernameInDb( $username );
$locationId = functAddLocationInDb( $location );
//пример функции вставки
function functAddUsernameInDb( $name ) {
$sql = "INSERT INTO `usernames` (`username`,`time`) VALUES ('".$name."','".time()."')";
$result = mysqli_query($link, $sql);
}
//запрос, с учетом 2х новых полей
$sql = "INSERT INTO `table` (`get_url`,`code_collection`,`download_url`,`storage_id`,`location`,`width`,`height`,`username_id`,`time`,`size`, `new_param1`,`new_param2`)
VALUES(
'".$clearUrl."',
'".$code."',
'".$download_url."',
'".$storageId."',
'".$locationId."',
'".$width."',
'".$height."',
'".$usernameId."',
'".$time."',
'".$size."',
'".$new_param1."',
'".$new_param2."'
)";
Так в чем же собственно вопрос то :lol:
Как не меняя имени таблицы безболезненно заменить данные в трех полях на их id и вставить в три новых специально созданных для этих id поля?
Не сильно ли будет увеличиваться время работы, если перед основных запросом я буду выполнять 3 разных запроса для получения id нужных элементов для вставки их в финальный запрос, может это можно выполнить за 1 запрос как-нибудь?
Спасибо.