yaleksandr89
@yaleksandr89
Junior PHP developer

Как составить SQL запрос?

Здравствуйте.
Изучаю работу с БД, поэтому строго не судите ,если вопрос дилетантский :). В бд 3 таблицы:
1. id_url, external_url
2 id_url, short_url
3 (результирующая) id_shortener, dt, external_url, short_url

Столбцы external_url, short_url из 3 таблицы связаны(foreign keys) с соответствующими полями из таблиц 1,2.

Как правильно составить запрос на добавление данных в БД, чтобы введенный url (external_url) попадал в таблицу external, сокращенная ссылка в таблицу short, а также заполнялась таблица result.


Раньше все это находилось в одной таблице и запрос выглядел:
db_query('INSERT INTO short (url,short_key) VALUE (:original_link, :short_key)', [
        'original_link' => $preparedLink,
        'short_key' => $uniqueID
    ]);

Но в таком формате я ещё не писал запросы, поэтому буксую на этом моменте.

dump""

-- phpMyAdmin SQL Dump
-- version 4.9.1
-- https://www.phpmyadmin.net/
--
-- Хост: localhost
-- Время создания: Окт 12 2019 г., 21:42
-- Версия сервера: 10.4.8-MariaDB
-- Версия PHP: 7.3.10

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- База данных: `shortener`
--

-- --------------------------------------------------------

--
-- Структура таблицы `external`
--

CREATE TABLE `external` (
  `id_external` int(11) NOT NULL,
  `external` varchar(250) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Структура таблицы `result`
--

CREATE TABLE `result` (
  `id_url` int(11) NOT NULL,
  `dt` timestamp NULL DEFAULT current_timestamp(),
  `external` varchar(250) NOT NULL,
  `short` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Структура таблицы `short`
--

CREATE TABLE `short` (
  `id_short` int(11) NOT NULL,
  `short` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Индексы сохранённых таблиц
--

--
-- Индексы таблицы `external`
--
ALTER TABLE `external`
  ADD PRIMARY KEY (`id_external`),
  ADD UNIQUE KEY `external_external_uindex` (`external`);

--
-- Индексы таблицы `result`
--
ALTER TABLE `result`
  ADD PRIMARY KEY (`id_url`),
  ADD KEY `result___fk__short` (`short`),
  ADD KEY `result_fk__external` (`external`);

--
-- Индексы таблицы `short`
--
ALTER TABLE `short`
  ADD PRIMARY KEY (`id_short`),
  ADD UNIQUE KEY `short_short_uindex` (`short`);

--
-- AUTO_INCREMENT для сохранённых таблиц
--

--
-- AUTO_INCREMENT для таблицы `external`
--
ALTER TABLE `external`
  MODIFY `id_external` int(11) NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT для таблицы `result`
--
ALTER TABLE `result`
  MODIFY `id_url` int(11) NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT для таблицы `short`
--
ALTER TABLE `short`
  MODIFY `id_short` int(11) NOT NULL AUTO_INCREMENT;

--
-- Ограничения внешнего ключа сохраненных таблиц
--

--
-- Ограничения внешнего ключа таблицы `result`
--
ALTER TABLE `result`
  ADD CONSTRAINT `result___fk__short` FOREIGN KEY (`short`) REFERENCES `short` (`short`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `result_fk__external` FOREIGN KEY (`external`) REFERENCES `external` (`external`) ON DELETE CASCADE ON UPDATE CASCADE;
COMMIT;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

  • Вопрос задан
  • 126 просмотров
Решения вопроса 1
@FanatPHP
В общем, не надо мудрить, все должно быть в одной таблице.

В случае, когда таблиц несколько, сначала вставляем в первую, получаем идентификатор, и используем его при вставке в остальные.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@nozzy
Silex, Symfony, Laravel, SQL
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
SaveTime Москва
от 160 000 руб.
SaveTime Москва
от 100 000 руб.
Teamlead Ставрополь
от 25 000 до 50 000 руб.
20 нояб. 2019, в 14:32
3000 руб./за проект
20 нояб. 2019, в 14:26
500 руб./в час
20 нояб. 2019, в 14:22
150 руб./за проект