Мне нужно вставить новую строку или обновить существующую, где существующее условие находится в двух столбцах, ни один из которых не является первичным ключом. Я определил уникальный ключ для этих двух столбцов, как показано в следующей таблице.

-- phpMyAdmin SQL Dump
-- version 4.9.7
-- https://www.phpmyadmin.net/
--
-- Host: localhost:3306
-- Creato il: Feb 03, 2022 alle 16:33
-- Versione del server: 10.3.32-MariaDB
-- Versione PHP: 7.3.33

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

--
-- Database: `phar263d_PharmaComparisonMainDB`
--

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

--
-- Struttura della tabella `admin_link_access_right_types_list`
--

CREATE TABLE `admin_link_access_right_types_list` (
  `id` int(11) UNSIGNED NOT NULL,
  `admin_id` int(10) UNSIGNED NOT NULL,
  `access_right_types_list_id` int(10) UNSIGNED NOT NULL,
  `create_right` tinyint(1) DEFAULT NULL,
  `erase_right` tinyint(1) DEFAULT NULL,
  `read_right` tinyint(1) DEFAULT NULL,
  `modify_right` tinyint(1) DEFAULT NULL,
  `all_rights` tinyint(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dump dei dati per la tabella `admin_link_access_right_types_list`
--

INSERT INTO `admin_link_access_right_types_list` (`id`, `admin_id`, `access_right_types_list_id`, `create_right`, `erase_right`, `read_right`, `modify_right`, `all_rights`) VALUES
(1, 19, 9, 0, 1, 1, 0, 0),
(3, 19, 7, 0, 0, 0, 1, 0),
(4, 19, 18, 0, 0, 1, 0, 0),
(5, 19, 3, 0, 1, 0, 0, 0),
(6, 19, 4, 1, 0, 0, 0, 0),
(7, 19, 1, 1, 1, 1, 1, 1),
(8, 19, 12, 0, 0, 0, 0, 0),
(9, 19, 11, 0, 0, 0, 0, 0),
(10, 19, 10, 0, 0, 0, 0, 0),
(11, 19, 5, 0, 0, 0, 0, 0),
(12, 19, 20, 0, 0, 0, 0, 0),
(13, 19, 2, 0, 0, 0, 0, 0),
(14, 19, 15, 0, 0, 0, 0, 0),
(15, 19, 6, 0, 0, 0, 0, 0),
(16, 19, 14, 0, 0, 0, 0, 0),
(17, 19, 13, 0, 0, 0, 0, 0),
(18, 19, 8, 0, 0, 0, 0, 0),
(19, 19, 16, 0, 0, 0, 0, 0),
(20, 19, 17, 0, 0, 0, 0, 0),
(21, 19, 19, 0, 0, 0, 0, 0);

--
-- Indici per le tabelle scaricate
--

--
-- Indici per le tabelle `admin_link_access_right_types_list`
--
ALTER TABLE `admin_link_access_right_types_list`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `unique_admin_access` (`admin_id`,`access_right_types_list_id`),
  ADD KEY `ref_link_from_admin_to_access_right_types_list_TO_admin_idx` (`admin_id`),
  ADD KEY `ref_link_from_admin_to_access_right_types_list_TO_access_ri_idx` (`access_right_types_list_id`);

--
-- AUTO_INCREMENT per le tabelle scaricate
--

--
-- AUTO_INCREMENT per la tabella `admin_link_access_right_types_list`
--
ALTER TABLE `admin_link_access_right_types_list`
  MODIFY `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=48;

--
-- Limiti per le tabelle scaricate
--

--
-- Limiti per la tabella `admin_link_access_right_types_list`
--
ALTER TABLE `admin_link_access_right_types_list`
  ADD CONSTRAINT `admin` FOREIGN KEY (`admin_id`) REFERENCES `admin` (`id`),
  ADD CONSTRAINT `admins_to_admins_rights` FOREIGN KEY (`access_right_types_list_id`) REFERENCES `access_right_types_list` (`id`);
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 */;

Если я запускаю запрос mySql, подобный этому

INSERT INTO admin_link_access_right_types_list (admin_id, access_right_types_list_id, create_right, erase_right, read_right, modify_right, all_rights) 
VALUES(19, 9, 1, 0, 0, 0, 0) 
ON DUPLICATE KEY UPDATE admin_id=19, access_right_types_list_id=9

Он не добавляет новую строку, как ожидалось, но, к сожалению, он также не обновляет существующую строку с admin_id=19, access_right_types_list_id=9, возвращая предыдущие существующие цифры следующим образом

снимок экрана с необновленной строкой

Любое предложение или идея? Большое спасибо.

0
fede72bari 3 Фев 2022 в 18:43

2 ответа

Лучший ответ

Ваш запрос фактически выполняет обновление ключа-дубликата, но вы не вводите новые (изменяющиеся) данные.

Вы пытаетесь обновить с

admin_id=19, access_right_types_list_id=9

К

admin_id=19, access_right_types_list_id=9

Что то же самое.

2
Daniel W. 3 Фев 2022 в 19:00
Спасибо, я неправильно понял утверждение, думая, что «ON DUPLICATE KEY UPDATE admin_id = 19, access_right_types_list_id = 9» было контролем дублирования. Вместо того, что я могу понять из вашего любезного ответа, дублирование просто подтверждается конфликтом уникального ключа, включающего два столбца, и здесь мне нужно просто поместить поля и значения, которые я хочу обновить, верно? Спасибо.
 – 
fede72bari
3 Фев 2022 в 20:35

Как вы можете сказать, что он не обновляется, если вы устанавливаете только admin_id и access_right_types_list_id?

Я ожидаю, что все столбцы будут заданы, а предложения значений, используемые для установки значений

Вам следует просмотреть https://dev.mysql.com /doc/refman/8.0/en/insert-on-duplicate.html

0
P.Salmon 3 Фев 2022 в 19:02