为什么更新因唯一索引而失败而没有重复值?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么更新因唯一索引而失败而没有重复值?相关的知识,希望对你有一定的参考价值。
我猜这张图片解释了一切:
看到?我正在设置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 */
;
答案
实际上,图像确实解释了一切。这是令人惊讶的 - 通常图像不是那么有用。
我可以想到三种可能性,但可能还有其他可能性。
- 您在表上有一个触发器,它将
trans_id
设置为此表或另一个表中的其他值。 - 在
2
之前,您在字符串中有一个字符。字符串将转换为数字,非数字字符将转换为0。 - 你的语法完全关闭(一旦我扩展图像,我就可以更好地阅读SQL)。
(请注意,即使列是数字,mysql也会将值放在单引号中,因此错误消息不会提供基础类型的证据。)
在任何情况下,您都不应该使用单引号来表示数字常量。你需要一个逗号而不是and
。因此,将查询写为:
update support_us
set trans_id = 2,
status_started = 1
where . . . ;
您所做的是将trans_id
的值设置为与where
匹配的所有行上的布尔表达式。该值为0或1 - 因此,如果您有两行以上,则可以保证获得重复的trues(1)或重复的falses(0)。
另一答案
我必须在我的查询中使用,
而不是AND
。
以上是关于为什么更新因唯一索引而失败而没有重复值?的主要内容,如果未能解决你的问题,请参考以下文章