为什么更新因唯一索引而失败而没有重复值?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么更新因唯一索引而失败而没有重复值?相关的知识,希望对你有一定的参考价值。

我猜这张图片解释了一切:

enter image description here

看到?我正在设置2的值,但它说0是重复的。为什么? 0来自哪里?


这是表结构:

-- phpMyAdmin SQL Dump
-- version 4.7.0
-- https://www.phpmyadmin.net/
--
-- Host: 127.0.0.1
-- Generation Time: Mar 04, 2018 at 04:18 PM
-- Server version: 10.1.26-MariaDB
-- PHP Version: 7.1.8
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: `spy`
--
-- --------------------------------------------------------
--
-- Table structure for table `support_us`
--
CREATE TABLE `support_us` ( `id` int(10) UNSIGNED NOT NULL, `user_id` int(10) UNSIGNED DEFAULT NULL COMMENT 'null means have not logged in', `full_name` varchar(100) CHARACTER 
SET
   utf8 COLLATE utf8_unicode_ci NOT NULL, `publish_name` tinyint(1) NOT NULL COMMENT '1 means show the name and 0 means don''t', `user_amount` varchar(20) NOT NULL, `final_amount` varchar(20) DEFAULT NULL, `cell_phone` varchar(20) NOT NULL, `trans_id` varchar(20) DEFAULT NULL COMMENT 'null means it''s just a intention (trans_id hasn''t issued yet by pay.ir)', `status_started` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1 means the user is getting redirect to bank page and 0 means it couldn''t connect to bank port', `send_error_code` varchar(10) DEFAULT NULL COMMENT 'go to function.php fine, send() function', `status_finished` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1 means finished successfully and 0 means failed', `verify_error_code` varchar(10) DEFAULT NULL COMMENT 'go to function.php fine, verify() function', `card_number` varchar(20) DEFAULT NULL, `message` varchar(200) DEFAULT NULL, `date_time` int(10) UNSIGNED NOT NULL ) ENGINE = InnoDB DEFAULT CHARSET = latin1;
--
-- Indexes for dumped tables
--
--
-- Indexes for table `support_us`
--
ALTER TABLE `support_us` ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `trans_id` (`trans_id`), ADD KEY `publish_name` (`publish_name`);
--
-- AUTO_INCREMENT for dumped tables
--
--
-- AUTO_INCREMENT for table `support_us`
--
ALTER TABLE `support_us` MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT = 41;
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 */
;
答案

实际上,图像确实解释了一切。这是令人惊讶的 - 通常图像不是那么有用。

我可以想到三种可能性,但可能还有其他可能性。

  1. 您在表上有一个触发器,它将trans_id设置为此表或另一个表中的其他值。
  2. 2之前,您在字符串中有一个字符。字符串将转换为数字,非数字字符将转换为0。
  3. 你的语法完全关闭(一旦我扩展图像,我就可以更好地阅读SQL)。

(请注意,即使列是数字,mysql也会将值放在单引号中,因此错误消息不会提供基础类型的证据。)

在任何情况下,您都不应该使用单引号来表示数字常量。你需要一个逗号而不是and。因此,将查询写为:

update support_us
    set trans_id = 2,
        status_started = 1
    where . . . ;

您所做的是将trans_id的值设置为与where匹配的所有行上的布尔表达式。该值为0或1 - 因此,如果您有两行以上,则可以保证获得重复的trues(1)或重复的falses(0)。

另一答案

我必须在我的查询中使用,而不是AND

以上是关于为什么更新因唯一索引而失败而没有重复值?的主要内容,如果未能解决你的问题,请参考以下文章

Doctrine2 Merge() 因复合索引而失败教义2错误?

通用代码因 Spring 数据和 Querydsl 而失败

Hive 通用 UDTF 因数组索引超出范围错误而失败

“更新数据库”命令因超时异常而失败

Qt 和 CMake 因重复符号而失败

Lambda 函数因无法导入模块“索引”而失败