【问题标题】:Insert query based on number of rows根据行数插入查询
【发布时间】:2013-09-13 09:59:45
【问题描述】:

我想要一个查询来将一行插入到表中,我知道这很简单,但情况是表不应超过 5 行。如果表有超过五行我需要删除旧行(或替换为新行)(基于插入时间戳)然后我需要插入一个新行。如果行数少于 5,那么我可以直接插入一行。

请分享我的查询。

【问题讨论】:

  • 首先是插入,然后是行计数,删除还是什么?只是大声思考
  • 你应该展示你所拥有的
  • 你真的需要它在所有这些 RDBMS 中工作吗?

标签: mysql sql oracle db2 qsqlquery


【解决方案1】:

这样的事情怎么样。

declare @count int

SELECT @count=COUNT(*)
from EP_ANSWERS

IF (@count<5)
// DO your insert here
ELSE
DELETE FROM TABLE
 WHERE inserttimestamp = (SELECT x.inserttimestamp
                         FROM (SELECT MAX(t.inserttimestamp) AS inserttimestamp
                                 FROM TABLE t) x)
// DO your insert here

【讨论】:

  • 如果我没有插入时间戳列,那么我们如何识别非常旧的行并将其删除?
  • 在不知道表的架构的情况下很难回答这个问题。但是,如果您有一个标识列,您将能够通过获取最小 ID 来获取最旧的行。但是,如果您手动更改 id,这将无法保证获得所需的结果。
【解决方案2】:

如果表格不可能超过 5 行:

DELETE FROM yourtable
 WHERE 5 <= (SELECT COUNT(*) FROM yourtable)
   AND yourtimestamp = (SELECT MIN(yourtimestamp) FROM yourtable)
;

INSERT INTO yourtable ...
;

如果表格有可能超过 5 行:

DELETE FROM yourtable
 WHERE 5 <= (SELECT COUNT(*) FROM yourtable)
   AND yourtimestamp NOT IN (SELECT yourtimestamp
                               FROM yourtable
                              ORDER BY yourtimestamp DESC
                              LIMIT 4)
;

INSERT INTO yourtable ...
;

【讨论】:

    【解决方案3】:

    听起来你想在表上放置一个触发器来维护这个规则,在 MySQL 中这样的东西应该可以工作

    CREATE TRIGGER trg__my_table__limit_rows
    BEFORE INSERT
    ON my_table
    FOR EACH ROW 
    BEGIN
        IF ((SELECT COUNT(1) FROM my_table) = 5)
        BEGIN            
            DELETE FROM my_table
            WHERE id = (SELECT MIN(id) FROM my_table)  -- change this to fit your logic for which record should be removed
        END
    END
    

    【讨论】:

    • IF ((SELECT COUNT(1) FROM my_table) &gt;= 5) 我认为只是一个错字:-)
    【解决方案4】:

    这里的一些代码是伪代码(您没有编写架构),但我写了您需要完成自己的代码的地方。

    DECLARE @NumberOfRowsToInsert INT = -- select from the data you want to insert
    DECLARE @MaxNumberOfRows INT = 5
    DECLARE @NumberOfExistingRows INT
    
    DECLARE @Query VARCHAR(MAX) = 'SELECT TOP @rows id FROM SomeTable ORDER BY createdDate ASC'
    
    SELECT @NumberOfExistingRows = COUNT(*)
    FROM SomeTable
    
    SET @Query = REPLACE(@Query,'@rows',
     CAST(@NumberOfRowsToInsert - (@MaxNumberOfRows - @NumberOfExistingRows))) AS VARCHAR(1))
    
    CREATE TABLE #IdsToDelete(id INT PRIMARY KEY)
    
    INSERT INTO #IdsToDelete
    EXEC(@Query)
    
    DELETE FROM SomeTable
    WHERE id IN (SELECT * FROM #IdsToDelete)
    
    -- insert here..
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-29
      相关资源
      最近更新 更多