yaleksandr89
@yaleksandr89
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 */;

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

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

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

Войти через центр авторизации
Похожие вопросы