【问题标题】:MySQL delete first row when new is added when at 15 rowsMySQL 在 15 行时删除第一行时添加新行
【发布时间】:2018-06-16 15:32:18
【问题描述】:

当一个表中有15 行,然后我添加一个新行时,有没有办法自动删除该表中的第一行?

所以应该是这样的: ids 1-15 ,然后当我添加一个新的: ids 2-16 ,然后我再次添加一个新的: ids 3-17 等等。

编辑1: 我现在有这个代码,但它对我不起作用。

    $this->db->select('count(*)');
    $this->db->from('chat');

    $countChat = $this->db->get();

    if ($countChat >= '16') {
        $this->db->delete();
        $this->db->from('chat');
        $this->db->order_by('id');
        $this->db->limit('1');
    }

【问题讨论】:

  • 添加后,您可以运行查询来计算行数。如果是 15,则删除第一个。虽然我也建议您添加一个创建日期列,以便您知道首先添加了哪一行等
  • 也许使用INSERT 触发器?您还需要仔细定义“第一”的含义。最低身份证?还有什么?虽然老实说,我无法想象你为什么需要这样的东西,而且我高度怀疑这个问题之外的某个地方的设计决策很糟糕。
  • 我需要一个聊天框,我希望它在聊天框中最多有 15 条消息,然后在发送新消息时删除最新消息,第一个是最低 id

标签: php mysql


【解决方案1】:

当你在表中添加新行时,你应该像这样删除最小 id

DELETE FROM myTable 
ORDER BY my_id
LIMIT 1;

确保您的 idauto-increment

首先根据您的要求计算总行数

SELECT COUNT(*) FROM tablename;

然后使用if条件

if($countRows >= 15)
{
   // execute delete query
}

【讨论】:

  • 这看起来像我要找的东西,但是有没有办法让它在删除最低 id 之前检查表是否有 15 行?
  • 是的,您可以使用count 像这样SELECT COUNT(*) FROM tablename; 进行检查
  • 我刚试过,但它对我不起作用,我用我现在拥有的代码编辑了我的帖子。
【解决方案2】:

如果您只想在表格中总共保留 15 行,那么:

delete
from yourtable
where yourid < (select yourid
                from yourtable
                order by yourid desc
                limit 14, 1)

【讨论】:

    【解决方案3】:

    一个想法是将约束包含在 INSERT 本身中。

    另一个想法是只允许更新,如下:

    DROP TABLE IF EXISTS my_table;
    
    CREATE TABLE my_table (ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP PRIMARY KEY,string VARCHAR(20) NOT NULL);
    
    INSERT INTO my_table VALUES 
    ('2018-01-07 13:04:40 | one'),
    ('2018-01-07 13:04:45 | two'),
    ('2018-01-07 13:04:51 | three'),
    ('2018-01-07 13:04:57 | four'),
    ('2018-01-07 13:05:02 | five'),
    ('2018-01-07 13:05:07 | six'),
    ('2018-01-07 13:05:12 | seven'),
    ('2018-01-07 13:05:17 | eight'),
    ('2018-01-07 13:05:22 | nine'),
    ('2018-01-07 13:05:27 | ten'),
    ('2018-01-07 13:05:32 | eleven'),
    ('2018-01-07 13:05:38 | twelve'),
    ('2018-01-07 13:05:43 | thirteen'),
    ('2018-01-07 13:05:50 | fourteen'),
    ('2018-01-07 13:05:54 | fifteen');
    
    UPDATE my_table SET ts = CURRENT_TIMESTAMP, string = 'sixteen' ORDER BY ts LIMIT 1;
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    SELECT * FROM my_table;
    +---------------------+----------+
    | ts                  | string   |
    +---------------------+----------+
    | 2018-01-07 13:04:45 | two      |
    | 2018-01-07 13:04:51 | three    |
    | 2018-01-07 13:04:57 | four     |
    | 2018-01-07 13:05:02 | five     |
    | 2018-01-07 13:05:07 | six      |
    | 2018-01-07 13:05:12 | seven    |
    | 2018-01-07 13:05:17 | eight    |
    | 2018-01-07 13:05:22 | nine     |
    | 2018-01-07 13:05:27 | ten      |
    | 2018-01-07 13:05:32 | eleven   |
    | 2018-01-07 13:05:38 | twelve   |
    | 2018-01-07 13:05:43 | thirteen |
    | 2018-01-07 13:05:50 | fourteen |
    | 2018-01-07 13:05:54 | fifteen  |
    | 2018-01-07 13:07:15 | sixteen  |
    +---------------------+----------+
    15 rows in set (0.00 sec)
    
    mysql>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-23
      • 2012-02-24
      • 1970-01-01
      • 2018-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-20
      相关资源
      最近更新 更多