【问题标题】:MySQL adding new data by deleting old and keeping row count sameMySQL通过删除旧数据并保持行数相同来添加新数据
【发布时间】:2017-07-21 11:48:21
【问题描述】:

我有一个test2 表,它是这样创建的:

CREATE TABLE test2(
name VARCHAR(20),
time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
);

现在我只想在表中存储 5 行。因此,每次我添加数据时,它都会检查行数是否 = 5,然后它会删除最旧的数据并添加新数据,否则它只会添加数据。代码如下:

IF(COUNT(name) FROM test2 >= "5") 
THEN 
(DELETE FROM test2 WHERE time = MIN(time) AND (INSERT INTO test2 (name) 
VALUE('icecream')));
ELSE 
(INSERT INTO test2(name) VALUE('icecream'))
END IF;

但此代码格式在 IFELSE 语句上显示 2 个错误。重新格式化它以获得正确的输出。

【问题讨论】:

  • 那么“user”和这个表结构有什么关系呢?
  • 为了简单起见,现在完美地编辑了表格结构。
  • 将 ` => 5` 替换为 ` >= 5 `
  • 那些单引号是“name”吗?他们不应该在列名周围
  • 已编辑,但 IF ELSE 仍以红线显示。

标签: mysql sql mariadb


【解决方案1】:

或者,您可以删除第 4+ 行并添加第 5 行。不需要过程,但需要两个查询

DELETE FROM test2 WHERE id IN
(
  SELECT id FROM
  (
    SELECT id FROM test2 ORDER BY ts DESC LIMIT 4,999
  ) t
);
INSERT INTO test2 (`name`) VALUES ('icecream');

【讨论】:

  • 您好,我用您的程序答案更新了问题。你能解决它吗?
  • @mimi 只需更改 ORDER BY time ASC LIMIT 1 - 对我来说很好
  • 我试了还是报错。能否请发布创建过程的完整代码以及如何访问它以添加数据?
  • @mimi use this code 然后查询数据库CALL add_data('test')
  • 感谢您的代码,它运行良好。我会建议您使用您的 github 代码更新您的答案,以便更好地查看未来的读者。
【解决方案2】:

这应该可以正常工作。当然你需要过程来做,你不能同时选择,删除和插入

CREATE PROCEDURE `add_data`(IN data VARCHAR(20))
BEGIN
  DECLARE c INT;
  SELECT COUNT(name) FROM test2 INTO c;
  IF(c >= 5) THEN 
    DELETE FROM test2 ORDER BY `time` ASC LIMIT 1;
    INSERT INTO test2 (`name`) VALUE(data);
  ELSE 
    INSERT INTO test2(`name`) VALUE(data);
  END IF;
END

【讨论】:

  • IF ELSE & END 有 3 个红色标记。我需要用 PHP 执行这个完整的 Mysql 代码。
  • @mimi 你需要创建mysql过程,如果没有过程,你不能使用if else end。您不能在一个查询中进行删除、插入和选择
猜你喜欢
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 2021-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-08
相关资源
最近更新 更多