|  | | 
 
| 
           
             | 
                 
                   | Тема |  Помощ за MySQL заявка DELETE  + SELECT   |  |  | Автор | caller (Нерегистриран) |  | Публикувано | 14.11.06 15:08 |  |  | 
           
 Искам да изтрия няколко реда от таблицата. Само че да имам информация за изтритите имена. Тоест нещо като
 DELETE FROM images WHERE ID IN(1,2,3) Само че да ми върне и NAME-овете на изтритите редове. Възможно ли е нещо такова без stored procedur-а, респективно SELECT преди това?
 
 
 
 
 |  |  |  
             | 
                 
                   | Тема |  Re: Помощ за MySQL заявка DELETE  + SELECT
[re: caller] |  |  | Автор | Dakota (erotoman) |  | Публикувано | 16.11.06 19:21 |  |  | 
           
 Не се сещам за вариант без съхранена процедура. А дори и с такава, ще трябва да си запазиш някъде записите временно:
 
 
 CREATE TABLE test (id INT, name CHAR(1));
 INSERT INTO test VALUES (1, 'A');
 INSERT INTO test VALUES (2, 'B');
 INSERT INTO test VALUES (3, 'C');
 
 
 Опитите ми с обикновена функция доведоха до неуспех:
 
 
 mysql> SET GLOBAL log_bin_trust_function_creators = 1;
 mysql> delimiter $$
 mysql> create function delete_from_test (p_id int) returns boolean modifies sql data
 begin
 delete from test where id=p_id;
 return true;
 end;
 $$
 Query OK, 0 rows affected (0.00 sec)
 
 mysql> delimiter ;
 mysql> select name, delete_from_test(id) from test;
 ERROR 1442 (HY000): Can't update table 'test' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
 
 
 В PostgreSQL пък същото си работи без проблем:
 
 
 rating=# create or replace function delete_from_test (int) returns void as
$$
 DELETE FROM test WHERE id=$1;
 $$
 LANGUAGE 'sql' VOLATILE;
 
 rating=# select name, delete_from_test(id) from test;
 name | delete_from_test
 ------+------------------
 A    |
 B    |
 C    |
 (3 rows)
 
 rating=# select * from test;
 id | name
 ----+------
 (0 rows)
 
 
 За какво ти е изобщо това всъщност? Не можеш ли просто да си избереш със SELECT редовете и после да ги изтриеш?
 
 Everything louder than everything else...
 Редактирано от Dakota на 16.11.06 19:23. 
 
 |  |  |  
             | 
                 
                   | Тема |  Re: Помощ за MySQL заявка DELETE  + SELECT  [re: Dakota] |  |  | Автор | phpGuru (непознат
) |  | Публикувано | 17.11.06 12:57 |  |  | 
           
 в 8.2 на postgresql ще вкарат "oracle style" конструкцията RETURNING за update/delete и т.н.
 
 ето от документацията за DELETE http://developer.postgresql.org/pgdocs/postgres/sql-delete.html
 
 
 
 
 |  |  |  
             | 
                 
                   | Тема |  Re: Помощ за MySQL заявка DELETE  + SELECT  [re: caller] |  |  | Автор | zzzzzzzzz (Нерегистриран) |  | Публикувано | 17.11.06 13:52 |  |  | 
           
 А защо ти е в такъв случай да триеш редовете
 
 update images set deleted=1 where id in (1,2,3);
 ще си направиш deleted индекс (за по бързо търсене) и ще избираш WHERE deleted=0 или deleted=1 в зависимост какво ти трябва.
 
 
 
 
 |  |  |  
             | 
                 
                   | Тема |  Re: Помощ за MySQL заявка DELETE  + SELECT  [re: phpGuru] |  |  | Автор | wqw (АзСъмЖив) |  | Публикувано | 17.11.06 17:50 |  |  | 
           
 В SQL2005 има
 
 DELETE MyTable
 OUTPUT deleted.ID
 WHERE ID IN (...)
 
 ... което връща ID-та на изтритите редове.
 
 cheers,
 </wqw>
 
 
 
 
 
 |  |  |  
             | 
                 
                   | Тема |  Re: Помощ за MySQL заявка DELETE  + SELECT  [re: Dakota] |  |  | Автор | caller (Нерегистриран) |  | Публикувано | 20.11.06 20:08 |  |  | 
           
 За какво ти е изобщо това всъщност? Не можеш ли просто да си избереш със SELECT редовете и после да ги изтриеш?
 
 Точно това и правя. Имах мерак да спестя една заявка, обаче.
 
 
 
 
 |  |  |  
             | 
                 
                   | Тема |  Re: Помощ за MySQL заявка DELETE  + SELECT  [re: caller] |  |  | Автор | Dakota (erotoman) |  | Публикувано | 21.11.06 13:49 |  |  | 
           
 Е, освен ако не става въпрос за много голям обем от данни, които ще се изтриват, разликата едва ли би била значителна. Така или иначе, като ги избереш (select-неш) тия редове те отиват и чакат някъде на топло в кеша, така че изтриването би трябвало да мине бързичко.
 
 Everything louder than everything else...
 
 
 |  |  |  |  
 
 |   | 
 |