2013-09-13 6 views
2

Я хочу, чтобы запрос вставлял строку в таблицу, я знаю, что это просто, но сценарий - это таблица не должна содержать более 5 строк. Если таблица содержит более пяти строк, мне нужно удалить старую строку (или заменить новой строкой) (на основе штампа времени вставки), тогда мне нужно вставить новую строку. Если количество строк меньше, чем число 5, то я могу напрямую вставьте строку.Вставить запрос в зависимости от количества строк

Пожалуйста, поделитесь мной с запросом.

+0

первый в вставить, а затем количество строк с удалением или что-то еще? Просто подумайте вслух – AgeDeO

+0

Вы должны показать, что у вас есть –

+1

Вам действительно нужно работать на всех этих РСУБД? – Ben

ответ

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 
+0

Если у меня нет столбца inserttimestamp, то как мы можем идентифицировать старую строку и удалить ее? – Karthik207

+0

Трудно ответить на этот вопрос, не зная схемы вашего стола. Но если у вас есть столбец идентификаторов, вы сможете получить самые старые строки, получив минимальный идентификатор. Но если вы измените идентификаторы вручную, это не гарантирует желаемый результат. – dcp1986

0

Это звучит, как вы хотите поставить триггер на столе, чтобы сохранить это правило, в 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 
+0

'IF ((SELECT COUNT (1) FROM my_table)> = 5)' просто опечатка, я думаю :-) –

0

Часть кода здесь в псевдо (вы Бесполезный 't написал вашу схему), но я написал, где вам нужно заполнить свой собственный код.

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.. 
1

Если это невозможно для таблицы, чтобы иметь более 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 ... 
; 
Смежные вопросы