Alex' answer विस्तार करते हुए, और यह सोचते हैं आप एक incrementing, न दोहराई तालिका t
serial
नामित जो पंक्तियों की रिश्तेदार उम्र निर्धारित करने के लिए इस्तेमाल किया जा सकता पर सीरियल स्तंभ:
CREATE TRIGGER ten_rows_only AFTER INSERT ON t
BEGIN
DELETE FROM t WHERE serial <= (SELECT serial FROM t ORDER BY serial DESC LIMIT 10, 1);
END;
यह आपको कम से कम दस पंक्तियों है, और सबसे कम धारावाहिक DELETE
जब एक INSERT
ग्यारह पंक्तियों को आप धक्का होगा होगा जब कोई कार्य नहीं करेगा।
अद्यतन
यहाँ थोड़ी ज्यादा जटिल मामला है, जहां अपनी मेज रिकॉर्ड एक स्तंभ जो डुप्लिकेट होते हैं, उदाहरण के लिए एक TIMESTAMP
स्तंभ डालने बार ट्रैकिंग के रूप में हो सकता है में पंक्ति की "उम्र"।
sqlite> .schema t
CREATE TABLE t (id VARCHAR(1) NOT NULL PRIMARY KEY, ts TIMESTAMP NOT NULL);
CREATE TRIGGER ten_rows_only AFTER INSERT ON t
BEGIN
DELETE FROM t WHERE id IN (SELECT id FROM t ORDER BY ts DESC LIMIT 10, -1);
END;
यहाँ हम दी गई है कि हम id
उपयोग नहीं कर सकते रिश्तेदार उम्र का निर्धारण करने के लिए ले, तो हम पहले 10 पंक्तियों टाइमस्टैम्प द्वारा आदेशित के बाद सब कुछ को हटा दें। (SQLite उसी ts
साझा करने वाली पंक्तियों पर एक मनमाने ढंग से आदेश लगाता है)।
यह हमेशा पहली पंक्ति को नष्ट नहीं होगा सक्षम होना चाहिए? – aronchick
@aronchick, नहीं - 11 वीं स्थिति (संभवतः 11 वीं पंक्ति के हमारे INSERT के बाद) में कोई रिकॉर्ड नहीं होने पर स्केलर सबक्वायरी एनयूएलएल का मूल्यांकन करेगा, और इसलिए 'WHERE' क्लॉज तब' सीरियल <= NULL' बन जाएगा, जो कुछ भी मेल नहीं खाएगा। – pilcrow
क्या होगा यदि _id स्वतः बढ़ी है। क्या यह कोड TIMESTAMP या धारावाहिक के बजाय _id के साथ पूरा नहीं किया जा सका? विशेष रूप से जब एक टाइमस्टैम्प हमेशा तालिका स्कीमा का हिस्सा नहीं होता है ... –