@hrvasiliy

Как автоматизировать добавление поля?

Имеется таблица, в которой есть 3 столбца: язык, картинка и статья. Я пытаюсь придумать, как реализовать еще 1 столбец, в котором будет ИД. Данный ИД будет сообщать об уникальности статьи, но не относительно языков. То есть одна статья на разных языках должна иметь одинаковый ИД.

Возможности добавлять одинаковый ИД при первом добавлении в БД нет.
Создавать еще 1 таблицу для хранения ИД тоже нет возможности.

Как вариант, присваивать какой-то ИД для первой записи, потом получать этот ИД по ссылке картинки или статьи и добавлять к другой, новой записи. - Но это сильно увеличит кол-во запросов.

Может быть есть какой-то вариант написать какое-нибудь представление в БД и использовать его? Или может есть какие-то стандартные функции, что-то типа "если пытаемся добавить такое-то значение и оно не равно ничему то повысить значение поля на 1, иначе записать с тем ИД, который уже существует"?
  • Вопрос задан
  • 457 просмотров
Решения вопроса 1
mahoho
@mahoho
Full stack certified PHP developer.
Воспользуйтесь ограничителем UNIQUE по языку и это вашему ID:
ALTER TABLE `table_name` ADD UNIQUE (`language`, 'ID');

UPDATE: вот примерный код для управления полем ID при записи страниц в виде хранимой процедуры:
DELIMITER ;
DROP PROCEDURE IF EXISTS createLocalizedPage;
DELIMITER $
CREATE PROCEDURE createLocalizedPage(
	IN language_in VARCHAR(20),
	IN image_path_in VARCHAR(120),
	IN page_content_in LONGTEXT
) SQL SECURITY INVOKER
BEGIN
	DECLARE var_page_unique_id INT;
	
	START TRANSACTION ;
	IF (exists(SELECT 1 from `table_name` where image_path = image_path_in)) THEN
		SET var_page_unique_id =  (select max(`ID`) + 1 from `table_name`);
	ELSE		
		SET var_page_unique_id = (select `ID` from `table_name` where image_path = image_path_in);		
	END IF;
	
	INSERT INTO `table_name` (`language`, `image_path`, `page_content`, `ID`) VALUES
		(language_in, image_path_in, page_content_in, var_page_unique_id);
	COMMIT ;
END $
DELIMITER ;

Или вставить одним запросом:
INSERT INTO `table_name` (`language`, `image_path`, `page_content`, `ID`) 
VALUES	(
		language_in, 
		image_path_in, 
		page_content_in, 
		CASE 
			WHEN exists(SELECT 1 from `table_name` where image_path = image_path_in) then
				(select `ID` from `table_name` where image_path = image_path_in)
			ELSE
				(select max(`ID`) + 1 from `table_name`)
		END
	);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Можно установить тип столбца для языков как SET и тогда можно хранить в этом столбце несколько языков для одной статьи.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы