在不更新主键的情况下遵守唯一的\u约束

lc8prwob  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(243)

我在mysql中有一个表,比如说: ID - year - month 我对 year 以及 month . 这样一年不能有两个月。 ID 用于检索年和月的组合。假设我们有以下值:

ID -  year  -  month
1  -  20    -  1
2  -  20    -  2
3  -  20    -  5

那么 ID 3是2020年5月。但是,此表是动态构建的。我上传具体的数据,需要插入所有的年和月的组合。
首先我用的是mysql突击队 REPLACE INTO 因为我认为它不会添加非唯一行。它不会添加非唯一行,但会更新 ID 每次我的外键都被弄乱了。
我该怎么解决这个问题?只是使用 INSERT ? 由于唯一的\u约束,insert将失败并返回错误。
现在我把它修好了:

$conn = new mysqli(HOST, USER, PASS, DTBS);
         $stmt = $conn->prepare("SELECT ID FROM periods WHERE month=? AND year=?");
         $stmt->bind_param("ii", $month_, $year_);
         $month_ = $month;
         $year_ = $year;
         $stmt->execute();
         $stmt->bind_result($id);
         $stmt->fetch();
         $rows = $stmt->num_rows;
         $stmt->close();

         if ($rows == 0) {
             $stmt = $conn->prepare("INSERT INTO periods (year, month) VALUES (?, ?)");
             $stmt->bind_param("ii", $year_, $month_);
             $year_ = $year;
             $month_ = $month;
             $stmt->execute();
             $stmt->close();
         }
          $conn->close();
hxzsmxv2

hxzsmxv21#

你可以用 INSERT ... ON DUPLICATE KEY :

insert into periods(year, month)
values (?, ?)
on duplicate key update year = values(year)

这利用了 (year, month) . 当遇到重复的元组时,mysql不会 insert 它,然后去公园 on duplicate key 子句,其中执行伪更新。

相关问题