2009-10-18 8 views
1

je peux supprimer des enregistrements avec cette clause SQL,Je veux toujours laisser un enregistrement si table de l'enregistrement count = 1 avec SQL

DELETE FROM TABLE WHERE ID = 2 

J'ai besoin de toujours laisser un enregistrement si le nombre de table = 1, même si « ID = 2 ". Comment puis-je faire ceci?

+2

Pouvez-vous préciser ce que vous voulez? Voulez-vous supprimer toutes les lignes de la table sauf une? Ou voulez-vous seulement supprimer la ligne où 'ID = 2' * à moins que * ce soit la seule ligne restante dans la table? – VoteyDisciple

+0

Oui, comme vous l'avez dit, je peux supprimer toutes les lignes de la table sauf une. Mais excepté on peut ne pas être une valeur statique. La suggestion d'Andomar fonctionne bien. Merci pour ton intérêt. – Kerberos

Répondre

3

Ajouter une clause WHERE pour assurer il y a plus d'une ligne:

DELETE FROM TABLE 
WHERE ID = 2 
AND (SELECT COUNT(*) FROM TABLE) > 1 
1

Non testé, mais quelque chose dans les lignes de cela pourrait fonctionner?

DELETE FROM TABLE WHERE ID = 2 LIMIT (SELECT COUNT(*)-1 FROM TABLE WHERE ID=2); 

Peut-être ajouter dans une instruction if pour assurer le nombre est supérieur à 1.

+2

MySQL n'autorise pas les clauses à limite variable, voir: http://bugs.mysql.com/bug.php?id=6673 – Andomar

+0

Oh, eh bien, votre solution est supérieure. –

+0

je ne pouvais pas appliquer votre suggestion à mon projet. Bien sûr que ça peut marcher, absolument je ne pouvais pas. – Kerberos

1

façon simple est de refuser tout supprimer qui vide la table

CREATE TRIGGER TRG_MyTable_D FOR DELETE 
AS 
IF NOT EXISTS (SELECT * FROM MyTable) 
    ROLLBACK TRAN 
GO 

Plus complexe, si vous faites cette suppression multirow qui vide la table?

DELETE FROM TABLE WHERE ID BETWEEN 2 AND 5 

donc, repeupler au hasard de ce que vous venez de supprimer

CREATE TRIGGER TRG_MyTable_D FOR DELETE 
AS 
IF NOT EXISTS (SELECT * FROM MyTable) 
    INSERT mytable (col2, col2, ..., coln) 
    SELECT TOP 1 col2, col2, ..., coln FROM INSERTED --ORDER BY ?? 

GO 

Cependant, l'exigence est un peu dangereux et vague. En anglais, OK, "toujours avoir au moins une ligne dans le tableau", mais en pratique "quelle rangée?"

+0

Merci aussi. Mais votre niveau de suggestion est difficile pour mon niveau de connaissances SQL :) Peut-être que je peux utiliser votre suggestion à l'avenir. – Kerberos

Questions connexes