1 Востаннє редагувалося Replace (04.08.2012 16:42:17)

Тема: MySQL - Вставити значення в таблицю, якщо такого не існує

Гадаю така тема не завадить.

Власне питання:

Як одним запитом до mySQL бази перевірити чи задане певне значення (не PRIMARY KEY), якщо не задане - задати?
Для MSSQL знайшов такий код:

IF NOT EXISTS (SELECT * FROM `database`.`table` WHERE `param` = 'z1')
BEGIN
INSERT INTO `database`.`table` (`index`, `param`, `value`)
VALUES ('0', 'z1', '007');
END

як подібне зробити на mySQL ?

Таблиця така:

CREATE TABLE IF NOT EXISTS `table`
(
`index` INT(11) NOT NULL AUTO_INCREMENT,
`param` TINYTEXT NOT NULL,
`value` TINYTEXT NOT NULL,
PRIMARY KEY (`index`)
)

2

Re: MySQL - Вставити значення в таблицю, якщо такого не існує

А є можливість створити унікальний індекс для value?
Якщо ні, то думаю проблема в проектуванні. Потрібно або використовувати primary key, або додатково індекс для value

Подякували: Voron1

3

Re: MySQL - Вставити значення в таблицю, якщо такого не існує

Дякую за відповідь.
Подумав і вирішив не перевіряти унікальність запису, у базі записуються іноземні слова/вирази та переклад, одне й теж слово можна перекласти по-різному, тому гадаю нічого поганого немає у тому що на одне слово може бути кілька записів в таблиці.

4

Re: MySQL - Вставити значення в таблицю, якщо такого не існує

А індекс одразу на два поля? param та value.

5

Re: MySQL - Вставити значення в таблицю, якщо такого не існує

індекс ставиться автоматично (якщо я вірно зрозумів питання)

CREATE TABLE IF NOT EXISTS `table`
(
`index` INT(11) NOT NULL AUTO_INCREMENT,
`param` TINYTEXT NOT NULL,
`value` TINYTEXT NOT NULL,
PRIMARY KEY (`index`)
)

index - індекс (проставляється автоматично)
param - слово іноземною мовою
value - переклад слова

6 Востаннє редагувалося Replace (03.08.2012 23:49:25)

Re: MySQL - Вставити значення в таблицю, якщо такого не існує

Ні. Індекси слугують для суттєвого пришвичення роботи з базою даних. Якщо вам потрібно виконувати пошук по певному параметру, то обов'язково потрібно індексувати це поле (додати індекс).
В вашому випадку index = id, ідентифікатор - це певне число, яке ідентифікує запис в таблиці і зазвичай створюється автоматично.

Рекомендую вам почитати щось про індекси, це дуже важлива тема.

P.S. То було не питання а пропозиція.

7 Востаннє редагувалося Voron (04.08.2012 00:07:02)

Re: MySQL - Вставити значення в таблицю, якщо такого не існує

Погуглив, але при спроби задати індекс для полів param та value отримую помилку:

"#1170 - BLOB/TEXT column 'param' used in key specification without a key length"

причина у тому що param це TINYTEXT, можна задати VARCHAR(255) - тоді помилки не буде, можливо завтра поміняю.

Яка різниця між  Unique та Index?

8

Re: MySQL - Вставити значення в таблицю, якщо такого не існує

Можна так ще:

CREATE TABLE IF NOT EXISTS `table`
(
`index` INT(11) NOT NULL AUTO_INCREMENT,
`param` TINYTEXT NOT NULL,
`value` TINYTEXT NOT NULL,
PRIMARY KEY (`index`),
UNIQUE KEY (`param`(100), `value`(100))
)

Різниця: Index - це просто індекс (може повторюватись), а unique index - це унікальний індекс, який не повторюється, наприклад id-сторінки. Індекс може складатись як з одного поля так і з кількох.

Подякували: Voron1

9

Re: MySQL - Вставити значення в таблицю, якщо такого не існує

Voron написав:

Гадаю така тема не завадить.

Власне питання:

Як одним запитом до mySQL бази перевірити чи задане певне значення (не PRIMARY KEY), якщо не задане - задати?
Для MSSQL знайшов такий код:

IF NOT EXISTS (SELECT * FROM `database`.`table` WHERE `param` = 'z1')
BEGIN
INSERT INTO `database`.`table` (`index`, `param`, `value`)
VALUES ('0', 'z1', '007');
END

як подібне зробити на mySQL ?

Таблиця така:

CREATE TABLE IF NOT EXISTS `table`
(
`index` INT(11) NOT NULL AUTO_INCREMENT,
`param` TINYTEXT NOT NULL,
`value` TINYTEXT NOT NULL,
PRIMARY KEY (`index`)
)

Якщо я правильно зрозумів запитання то так:

UPDATE table SET value="myValue" WHERE param = "z1" AND value="";
Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }
Подякували: Voron1

10

Re: MySQL - Вставити значення в таблицю, якщо такого не існує

Replace написав:
UNIQUE KEY (`param`(100), `value`(100))

Якщо додати це, то замість українських букв будуть знаки питання.
Кодування таблиці utf8_unicode_ci

http://clip2net.com/clip/m40453/thumb640/1345615228-2012-08-22-090028_369x95_scrot-17kb.png


Patron написав:

Якщо я правильно зрозумів запитання то так:

UPDATE table SET value="myValue" WHERE param = "z1" AND value="";

Дещо не те що було потрібно, але дякую.
Цей код оновлює записи, мені потрібно було перевірити чи існує певний запис, якщо його не існує - додати, цікавило як це зробити одним запитом.

11

Re: MySQL - Вставити значення в таблицю, якщо такого не існує

А обов'язково використовувати TINYTEXT?

Ось така табличка норм:

CREATE TABLE `dictionary` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `param` varchar(255) DEFAULT '',
  `value` varchar(255) DEFAULT '',
  PRIMARY KEY (`id`),
  UNIQUE KEY `param` (`param`,`value`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Подякували: Voron1

12

Re: MySQL - Вставити значення в таблицю, якщо такого не існує

Я думав і читав і все таки знайшов вирішення цього питання))) Треба юзати користувацькі функції для таких цілей. Створюємо свою mysql функцію котра буде закріплена за вибраною базою даних. Нехай таблиця буде така:

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `login` varchar(50) DEFAULT NULL,
  `password` varchar(50) DEFAULT NULL,
  `email` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 ;

Фунцію назвемо myInsert, якщо ви не знаєте як додавати власні функції в mysql то читати тут і тут.

І так функція

DELIMITER //

CREATE FUNCTION myInsert(l VARCHAR(20), p VARCHAR(20), email VARCHAR(20))
  RETURNS VARCHAR(20)

  BEGIN
    DECLARE s VARCHAR(20);

    IF ( (SELECT IF( (SELECT id FROM users WHERE login =  l), 1, 0 ) ) = 1) THEN SET s = 'exists';
    ELSE INSERT INTO USERS VALUES (' ', l, p, email); SET s = 'good insert';
    END IF;
    RETURN s;

  END //

DELIMITER ;

Фунція приймає три параметри і якщо не виконується умова ( (SELECT IF( (SELECT id FROM users WHERE login =  l), 1, 0 ) ) = 1) функція вносить запис в базу і повертає good insert, в іншому випадку функція повертає exists;

Перевіряти ось так:

SELECT myInsert(
 'taraskin',  'qwerty',  'tarasko@mail.ru'
);
/* Результат
myInsert( 'taraskin', 'qwerty', 'tarasko@mail.ru' )
good insert
*/

//Пробуємо ще разок
SELECT myInsert(
 'taraskin',  'qwerty',  'tarasko@mail.ru'
);
/* Результат
myInsert( 'taraskin', 'qwerty', 'tarasko@mail.ru' )
exists
*/

Так що переробляйте під свою таблицю і користуйтеся. Доречі, функції видаляються так:

drop function myInsert;
Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }
Подякували: Replace, Voron2