SQL-запрос к INSERT, UPDATE или DELETE - PullRequest
1 голос
/ 26 января 2012

asset_property таблица:

| asset_id | property_id | property_value |
|:--------:|:-----------:|:---------------|
| 146      | 1           | 4G             |
| 146      | 3           | 68723-239Gs    |
| 147      | 1           | A7             |

Это мой запрос:

INSERT INTO asset_property (asset_id, property_id, property_value)
VALUES
  (146, 1, '4G'),
  (146, 2, 'Black & Decker'),
  (146, 3, ''),
ON DUPLICATE KEY
UPDATE property_value = VALUES(property_value);

Есть ли способ сказать что-то вроде этого:

INSERT INTO asset_property (asset_id, property_id, property_value)
VALUES
  (146, 1, '4G'),
  (146, 2, 'Black & Decker'),
  (146, 3, ''),
ON DUPLICATE KEY
UPDATE property_value = VALUES(property_value)
ON VALUES(property_value) IS NULL
DELETE FROM asset_property
WHERE asset_id = VALUES(asset_id)
AND property_id = VALUES(property_id);

Или я мог бы использовать PHP для определения пустых property_value наборов и построения второго запроса. Так что мне нужно это:

DELETE FROM asset_property
WHERE 'PRIMARY KEY' IN ('146-3');

Синтаксис в порядке, но затрагиваются 0 строк.

Я пробовал это:

SELECT 'PRIMARY KEY' FROM asset_property WHERE asset_id = 146;

Но результат:

| PRIMARY KEY |
|:------------|
| PRIMARY KEY |
| PRIMARY KEY |

В руководстве MySQL швы говорят, что вы не можете.

Ответы [ 3 ]

1 голос
/ 26 января 2012
DELETE FROM asset_property
WHERE 'PRIMARY KEY' IN ('146-3');

Синтаксис в порядке, но затронуто 0 строк.

Синтаксических ошибок нет, но это не значит, что все в порядке :) @rodrigoap уже объяснил, что это значит и почему 0 строк совпадают.

Если вам нужно удалить несколько записей, соответствующих составному первичному ключу, вам нужно будет сделать одну из следующих:

DELETE FROM asset_property
WHERE (asset_id = 146 AND property_id = 3)
   OR (asset_id = 146 AND property_id = 7)
   OR (asset_id = 146 AND property_id = 18)

или объедините поля и проверьте, что:

DELETE FROM asset_property
WHERE CONCAT(asset_id, '-', property_id) in ('146-3', '146-7', '146-18')

(этот будет медленнее, потому что он не может использовать какие-либо индексы)

или просто выполнить несколько операторов удаления внутри транзакции:

BEGIN
DELETE FROM asset_property
WHERE asset_id = 146 AND property_id = 3
DELETE FROM asset_property
WHERE asset_id = 146 AND property_id = 7
DELETE FROM asset_property
WHERE asset_id = 146 AND property_id = 18
COMMIT
0 голосов
/ 26 января 2012

Итак, ваш PRIMARY KEY состоит из asset_id и property_id ?.В этом случае вы можете сделать DELETE так:

DELETE FROM asset_property
WHERE asset_id = 146 AND property_id = 3
0 голосов
/ 26 января 2012
DELETE FROM asset_property
 WHERE 'PRIMARY KEY' IN ('146-3');

Удаляет 0 строк, поскольку предложение where равно false, текста «PRIMARY KEY» нет в списке («146-3»).

SELECT 'PRIMARY KEY' FROM asset_property WHERE asset_id = 146;

Этот код возвращает текст «ПЕРВИЧНЫЙ КЛЮЧ» для каждой строки таблицы asset_property, где asset_id равен 146.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...