2012-01-25 6 views
1

asset_property стол:SQL запрос к INSERT, UPDATE или DELETE

| 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 Manual швы, что вы не можете.

+0

Что вы ожидаете? почему вы выбираете «PRIMARY KEY» как строку? –

+0

Я не понял одиночные кавычки, обозначенные строкой _:/_ –

ответ

1
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

Отлично работает! Спасибо! –

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

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

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

Это один возвращается текст 'PRIMARY KEY' для каждой строки в таблице asset_property где ASSET_ID является 146.

+0

Есть ли sytax для указания конкретного PRIMARY KEY? Что-то вроде 143-3_? Теперь я понимаю, что «ПЕРВИЧНЫЙ КЛЮЧ» на самом деле не ссылается на «ПЕРВИЧНЫЙ КЛЮЧ». –

0

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

DELETE FROM asset_property 
WHERE asset_id = 146 AND property_id = 3 
+0

Мне нужно использовать 'IN (...)', потому что я могу удалить сразу несколько записей: 'IN ('146-3', '146-7', '146-18')'. В противном случае я застрял с отдельным запросом для каждого случая пустого поля. –

Смежные вопросы