表格被指定为插入的目标和数据源,导致重复出现。

10
我运行了这个查询,但它给我返回了一个错误,就像标题中所提到的一样。
INSERT INTO data_waktu_vaksinasi (id_binatang, id_vaksin, tanggal_vaksin, status_vaksin) VALUES 
    (1, 1, (SELECT DATE_ADD(max(tanggal_vaksin), INTERVAL 1 YEAR)) FROM data_waktu_vaksinasi, 'belum')

1
这个有问题吗?INSERT INTO data_waktu_vaksinasi (id_binatang, id_vaksin, tanggal_vaksin, status_vaksin) VALUES (1, 1, (SELECT DATE_ADD(max(tanggal_vaksin), INTERVAL 1 YEAR) FROM data_waktu_vaksinasi), 'belum') - Phiter
@PhiterFernandes 我尝试在phpmyadmin上运行它,但是它给了我一个错误,说表被指定了两次。 - Lia Dianti
请仅返回翻译后的文本:相关: https://dev59.com/iVcP5IYBdhLWcg3wAmEE - That Brazilian Guy
3个回答

13

MySQL允许在inserts操作中使用相同的表作为源表和目标表,只需要使用正确的语法:

INSERT INTO data_waktu_vaksinasi (id_binatang, id_vaksin, tanggal_vaksin, status_vaksin) 
     SELECT 1, 1, DATE_ADD(max(tanggal_vaksin), INTERVAL 1 YEAR), 'belum'
     FROM data_waktu_vaksinasi;

@LiaDianti……我不明白你的问题。也许你应该提出另一个问题,并附上示例数据来解释你想要的内容。 - Gordon Linoff
所以我想用这个查询一次插入多个数据,像这样 INSERT INTO data_waktu_vaksinasi (id_binatang, id_vaksin, tanggal_vaksin, status_vaksin) VALUES ('$id', 1, SELECT 1, 1, DATE_ADD(max(tanggal_vaksin), INTERVAL 1 YEAR), '$status'), ('$id', 2, SELECT 1, 1, DATE_ADD(max(tanggal_vaksin), INTERVAL 1 YEAR), '$status'), ('$id', 3, SELECT 1, 1, DATE_ADD(max(tanggal_vaksin), INTERVAL 1 YEAR), '$status') 但它仍然给了我错误提示。 - Lia Dianti

3
将源表放入子查询中即可解决这个问题。在 DML 操作中,Mysql 不允许源表和目标表相同。请保留 html 标签。
INSERT INTO data_waktu_vaksinasi 
            (id_binatang, 
             id_vaksin, 
             tanggal_vaksin, 
             status_vaksin) 
SELECT 1, 
       1, 
       dt, 
       'belum' 
FROM   (SELECT Date_add(Max(tanggal_vaksin), interval 1 year) AS dt 
        FROM   data_waktu_vaksinasi)a 

哎呀,这个答案不正确。MySQL 不允许在 updatedelete 中引用同一张表。但是它允许在 insert 中引用同一张表。 - Gordon Linoff
哎呀,我应该补充说明代码是正确的,只是过于复杂了。 - Gordon Linoff

2

尝试这段代码

INSERT INTO data_waktu_vaksinasi
(id_binatang, id_vaksin, tanggal_vaksin, status_vaksin)
VALUES
    (
        1,
        1,
        (
            SELECT date FROM
                (SELECT DATE_ADD(max(tanggal_vaksin), INTERVAL 1 YEAR) date
                 FROM data_waktu_vaksinasi, 'belum') subquery
        )
    )

我没有测试过这段代码,但我测试过一个等价的代码(也是一个带有子查询的INSERT INTO语句,子查询中的表与主查询相同)

诀窍

是将子查询中相同的表包装在另一个子查询中,该子查询仅查询实际子查询的SELECT子句中的列。

结果:Mysql不会抱怨

我不知道为什么这个方法有效
对我来说有点像作弊


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接