За последние 24 часа нас посетили 11232 программиста и 802 робота. Сейчас ищут 404 программиста ...

Как удалить строки из четырех таблиц одним запросом?

Тема в разделе "MySQL", создана пользователем saider2011, 7 дек 2022.

  1. saider2011

    saider2011 Новичок

    С нами с:
    17 дек 2021
    Сообщения:
    14
    Симпатии:
    1
    Есть такой запрос
    PHP:
    1. $del_sql="DELETE haracteristik, haracteristik_description
    2. FROM haracteristik
    3. INNER  JOIN haracteristik_description ON haracteristik_description.id = haracteristik.id
    4. WHERE haracteristik.id IN ('".trim($_POST['id'])."')";
    5. db_query($del_sql);
    6. $del_sql="DELETE haracteristik_variants, haracteristik_variants_description
    7. FROM haracteristik_variants
    8. INNER  JOIN haracteristik_variants_description ON haracteristik_variants_description.id = haracteristik_variants.id
    9. WHERE haracteristik_variants.parent_id IN ('".trim($_POST['id'])."')";
    10. db_query($del_sql);
    Но он выполняется в два запроса как надо, а как его объединить в один? Делаю так:
    PHP:
    1. $del_sql="DELETE haracteristik, haracteristik_description, haracteristik_variants, haracteristik_variants_description
    2. FROM haracteristik, haracteristik_variants
    3. INNER  JOIN haracteristik_description ON haracteristik_description.id = haracteristik.id
    4. INNER  JOIN haracteristik_variants_description ON haracteristik_variants_description.id = haracteristik_variants.id
    5. WHERE haracteristik.id IN ('".trim($_POST['id'])."') OR haracteristik_variants.parent_id IN ('".trim($_POST['id'])."')";
    6. db_query($del_sql);
    не работает
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.817
    Симпатии:
    1.171
    Адрес:
    там-сям
    Здесь php только мешает чтению. Могу только посоветовать отлаживать запросы в чем-то вроде pma или mysql workbench.

    [offtopic]
    совать в тело запроса пользовательские данные без плейсхолдеров/эскейпинга это очень плохой стиль
    [/offtopic]
     
  3. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.603
    Симпатии:
    685
    Адрес:
    Татарстан
    а если при планировании БД еще и внешние ключи делать адекватные - с каскадным удалением...
    так вообще не придется ломать над этим голову
     
  4. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.323
    Симпатии:
    257
  5. saider2011

    saider2011 Новичок

    С нами с:
    17 дек 2021
    Сообщения:
    14
    Симпатии:
    1
    Это да, но каскадное удаление как я понимаю работает только тогда когда у всех четырех таблиц есть один родитель по id а в моем же случае у меня есть две таблицы t1, t2 с одним одинаковым id и другие две t3, t4 с другим одинаковым id и они связанны через id родителя t1 и это все надо как то собрать в один запрос на удаление
     
  6. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.603
    Симпатии:
    685
    Адрес:
    Татарстан
    ключевое слово- каскадное
    tabl1 -> tabl2 -> tabl3
    если такая связь .. то при удалении записи из tabl3 удалится запись из tabl2 - так как удалится из tabl2 - удалится и из tabl1
     
    don.bidon нравится это.
  7. saider2011

    saider2011 Новичок

    С нами с:
    17 дек 2021
    Сообщения:
    14
    Симпатии:
    1
    Спасибо за подсказку, попробовал использовать каскадное удаление, все заработало, раньше как то не приходилось это использовать, только не сочти за наглость но подскажи вот что, допустим если есть две таблицы t1 и t2 у которых есть уникальные ключи id их я соединяю каскадно и есть третья таблица t3 у которой есть свой список с уникальным id и полем с parent_id в которых может быть созданно и 10 строк но все они будут иметь одиныковый parent_id из таблицы t1 то с каким индексом правильно будет настроить ключ в поле parent_id?
     
    don.bidon нравится это.
  8. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.603
    Симпатии:
    685
    Адрес:
    Татарстан
    Не воспринял обьяснение...
    Заведи таблицы на каком нить SQL fiddle
    И Обьясни, чего надо
     
  9. saider2011

    saider2011 Новичок

    С нами с:
    17 дек 2021
    Сообщения:
    14
    Симпатии:
    1
    Вот код, откроешь в MySql и посмотри все ли я сделал правильно с этими каскадами? Во время удалении я обращаюсь к таблице `haracteristik`

    Код (Text):
    1. -- phpMyAdmin SQL Dump
    2. -- version 5.1.1
    3. -- https://www.phpmyadmin.net/
    4. --
    5. -- Хост: localhost
    6. -- Время создания: Дек 08 2022 г., 18:16
    7. -- Версия сервера: 8.0.27
    8. -- Версия PHP: 7.4.26
    9.  
    10. SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
    11. START TRANSACTION;
    12. SET time_zone = "+00:00";
    13.  
    14.  
    15. /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    16. /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    17. /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    18. /*!40101 SET NAMES utf8mb4 */;
    19.  
    20. --
    21. -- База данных: `kaminberi`
    22. --
    23.  
    24. -- --------------------------------------------------------
    25.  
    26. --
    27. -- Структура таблицы `haracteristik`
    28. --
    29.  
    30. CREATE TABLE `haracteristik` (
    31.   `id` mediumint UNSIGNED NOT NULL,
    32.   `parent_id` mediumint UNSIGNED NOT NULL DEFAULT '0',
    33.   `purpose` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
    34.   `feature_style` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
    35.   `feature_type` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'T',
    36.   `filter_style` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
    37.   `categories_path` text CHARACTER SET utf8 COLLATE utf8_general_ci,
    38.   `position` smallint UNSIGNED NOT NULL,
    39.   `status` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'A'
    40. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
    41.  
    42. --
    43. -- Дамп данных таблицы `haracteristik`
    44. --
    45.  
    46. INSERT INTO `haracteristik` (`id`, `parent_id`, `purpose`, `feature_style`, `feature_type`, `filter_style`, `categories_path`, `position`, `status`) VALUES
    47. (83, 0, 'group_catalog', 'checkbox', 'S', 'color', 'NULL', 1, 'A'),
    48. (84, 109, 'organize_catalog', 'dropdown', 'E', 'checkbox', '34,54', 1, 'A'),
    49. (85, 104, 'organize_catalog', 'brand', 'S', 'checkbox', 'NULL', 1, 'A'),
    50. (86, 109, 'describe_product', 'text', 'S', '', '34,54', 1, 'A'),
    51. (91, 0, 'group_variation_catalog', 'dropdown', 'S', 'checkbox', 'NULL', 1, 'A'),
    52. (93, 0, 'find_products', 'text', 'S', 'checkbox', '2,53,36', 1, 'A'),
    53. (104, 0, '', '', 'G', '', 'NULL', 1, 'A'),
    54. (105, 0, '', '', 'G', '', 'NULL', 1, 'A'),
    55. (107, 0, 'find_products', 'text', 'S', 'checkbox', '34,54', 1, 'A'),
    56. (109, 0, '', '', 'G', '', '34,54', 1, 'A'),
    57. (202, 0, 'find_products', 'text', 'S', 'checkbox', 'NULL', 1, 'A');
    58.  
    59. -- --------------------------------------------------------
    60.  
    61. --
    62. -- Структура таблицы `haracteristik_description`
    63. --
    64.  
    65. CREATE TABLE `haracteristik_description` (
    66.   `id` mediumint UNSIGNED NOT NULL DEFAULT '0',
    67.   `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '',
    68.   `feature_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '',
    69.   `description` mediumtext CHARACTER SET utf8 COLLATE utf8_general_ci
    70. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
    71.  
    72. --
    73. -- Дамп данных таблицы `haracteristik_description`
    74. --
    75.  
    76. INSERT INTO `haracteristik_description` (`id`, `name`, `feature_name`, `description`) VALUES
    77. (83, 'dfgdfgdgrrrrr111', 'dfgdfgdg', '<p>gdg</p>\r\n'),
    78. (84, 'Хар1', 'fhfhrtyrt4rr555556456', ''),
    79. (85, 'hfghfg', 'hfghfghfgh', ''),
    80. (86, 'Хар2', 'Хар2', ''),
    81. (91, 'fghfhfh', 'fghfhfh', ''),
    82. (93, '1233ыв', '123', '<p>проверка</p>\r\n'),
    83. (104, 'проверка', 'проверка', ''),
    84. (105, 'укеукеуе', 'укеукеуе', '<p>описание</p>\r\n'),
    85. (107, 'укеукеуеуе', 'укеукеуеуе', ''),
    86. (109, 'укккккккк', 'укккккккк', '<p>кккккк</p>\r\n'),
    87. (202, 'пропро', 'пропро', '');
    88.  
    89. -- --------------------------------------------------------
    90.  
    91. --
    92. -- Структура таблицы `haracteristik_variants`
    93. --
    94.  
    95. CREATE TABLE `haracteristik_variants` (
    96.   `id` mediumint UNSIGNED NOT NULL,
    97.   `parent_id` mediumint UNSIGNED NOT NULL DEFAULT '0',
    98.   `url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '',
    99.   `color` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
    100.   `position` smallint UNSIGNED NOT NULL DEFAULT '0'
    101. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
    102.  
    103. --
    104. -- Дамп данных таблицы `haracteristik_variants`
    105. --
    106.  
    107. INSERT INTO `haracteristik_variants` (`id`, `parent_id`, `url`, `color`, `position`) VALUES
    108. (55, 202, '', '#ffffff', 1),
    109. (56, 202, '', '#ffffff', 1);
    110.  
    111. -- --------------------------------------------------------
    112.  
    113. --
    114. -- Структура таблицы `haracteristik_variants_description`
    115. --
    116.  
    117. CREATE TABLE `haracteristik_variants_description` (
    118.   `id` mediumint UNSIGNED NOT NULL DEFAULT '0',
    119.   `variant` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '',
    120.   `description` mediumtext CHARACTER SET utf8 COLLATE utf8_general_ci,
    121.   `page_title` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '',
    122.   `meta_keywords` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '',
    123.   `meta_description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ''
    124. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
    125.  
    126. --
    127. -- Дамп данных таблицы `haracteristik_variants_description`
    128. --
    129.  
    130. INSERT INTO `haracteristik_variants_description` (`id`, `variant`, `description`, `page_title`, `meta_keywords`, `meta_description`) VALUES
    131. (55, '', '', '', '', ''),
    132. (56, '', '', '', '', '');
    133.  
    134. --
    135. -- Индексы сохранённых таблиц
    136. --
    137.  
    138. --
    139. -- Индексы таблицы `haracteristik`
    140. --
    141. ALTER TABLE `haracteristik`
    142.   ADD PRIMARY KEY (`id`);
    143.  
    144. --
    145. -- Индексы таблицы `haracteristik_description`
    146. --
    147. ALTER TABLE `haracteristik_description`
    148.   ADD PRIMARY KEY (`id`);
    149.  
    150. --
    151. -- Индексы таблицы `haracteristik_variants`
    152. --
    153. ALTER TABLE `haracteristik_variants`
    154.   ADD PRIMARY KEY (`id`),
    155.   ADD KEY `parent_id` (`parent_id`);
    156.  
    157. --
    158. -- Индексы таблицы `haracteristik_variants_description`
    159. --
    160. ALTER TABLE `haracteristik_variants_description`
    161.   ADD PRIMARY KEY (`id`);
    162.  
    163. --
    164. -- AUTO_INCREMENT для сохранённых таблиц
    165. --
    166.  
    167. --
    168. -- AUTO_INCREMENT для таблицы `haracteristik`
    169. --
    170. ALTER TABLE `haracteristik`
    171.   MODIFY `id` mediumint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=203;
    172.  
    173. --
    174. -- AUTO_INCREMENT для таблицы `haracteristik_variants`
    175. --
    176. ALTER TABLE `haracteristik_variants`
    177.   MODIFY `id` mediumint UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=57;
    178.  
    179. --
    180. -- Ограничения внешнего ключа сохраненных таблиц
    181. --
    182.  
    183. --
    184. -- Ограничения внешнего ключа таблицы `haracteristik_description`
    185. --
    186. ALTER TABLE `haracteristik_description`
    187.   ADD CONSTRAINT `haracteristik_description_ibfk_1` FOREIGN KEY (`id`) REFERENCES `haracteristik` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT;
    188.  
    189. --
    190. -- Ограничения внешнего ключа таблицы `haracteristik_variants`
    191. --
    192. ALTER TABLE `haracteristik_variants`
    193.   ADD CONSTRAINT `haracteristik_variants_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `haracteristik` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT;
    194.  
    195. --
    196. -- Ограничения внешнего ключа таблицы `haracteristik_variants_description`
    197. --
    198. ALTER TABLE `haracteristik_variants_description`
    199.   ADD CONSTRAINT `haracteristik_variants_description_ibfk_1` FOREIGN KEY (`id`) REFERENCES `haracteristik_variants` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT;
    200. COMMIT;
    201.  
    202. /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    203. /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    204. /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
     
  10. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.603
    Симпатии:
    685
    Адрес:
    Татарстан
    не... чувак, ты не понял... я за тебя делать не собираюсь
    я говорю размести структуру БД в https://www.db-fiddle.com/ например.. "песочницу" для SQL
    тогда может я... или другие обитатели форума и заглянут посмотреть что там у тебя и подскажут что надо