81 votes

Supprimer le "premier" enregistrement d'une table en SQL Server, sans condition WHERE.

Est-il possible de supprimer le premièrement d'un enregistrement d'une table dans SQL Server sans utiliser de WHERE et sans utiliser de curseur ?

0 votes

Vous souhaitez nuancer vos demandes ?

0 votes

@Quassnoi : SQL Server selon le titre.

0 votes

S'il vous plaît, appelez-le MS-SQL la prochaine fois. Tout Le SGBD est un serveur SQL.

154voto

Quassnoi Points 191041
WITH  q AS
        (
        SELECT TOP 1 *
        FROM    mytable
        /* You may want to add ORDER BY here */
        )
DELETE
FROM    q

Notez que

DELETE TOP (1)
FROM   mytable

fonctionnera également, mais, comme indiqué dans le document documentation :

Les lignes référencées dans le TOP expression utilisée avec INSERT , UPDATE o DELETE ne sont pas disposés dans un ordre quelconque.

Par conséquent, il est préférable d'utiliser WITH et un ORDER BY qui vous permettra de spécifier plus précisément quelle ligne vous considérez comme la première.

2 votes

Notez que lorsque vous utilisez WITH dans l'expression, l'instruction sql précédente doit se terminer par un point-virgule ( ;)

0 votes

Utilisation de ORDER BY 1 offrirait une amélioration subtile des tables de nombreuses personnes dans SQL Server : vous obtiendriez la ligne avec la valeur de clé primaire la plus basse, probablement la "première" ligne. (Il est vrai que certaines tables n'ont pas la PK comme première colonne, mais 1 est mon raccourci paresseux préféré et je voulais le partager).

0 votes

@MagnusSmith : amélioration par rapport à quoi ?

51voto

soulmerge Points 37314

Dépend de votre SGBD

-- MYSql:
DELETE FROM table LIMIT 1;
-- Postgres:
DELETE FROM table LIMIT 1;
-- MSSql:
DELETE TOP(1) FROM table;
-- Oracle:
DELETE FROM table WHERE ROWNUM = 1;

0 votes

Celui d'Oracle viole la restriction "sans ... où" (quel que soit le but de cette restriction).

6voto

Alnitak Points 143355

Non, AFAIK, il n'est pas possible de le faire de manière portative.

Il n'y a pas de "premier" enregistrement défini de toute façon - sur différents moteurs SQL, il est parfaitement possible que " SELECT * FROM table "Il se peut que les résultats soient renvoyés dans un ordre différent à chaque fois.

3voto

Meff Points 4347

Définir "Premier" ? Si la table a un PK, elle sera ordonnée par celui-ci, et vous pouvez supprimer par celui-ci :

DECLARE @TABLE TABLE
(
    ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
    Data NVARCHAR(50) NOT NULL
)

INSERT INTO @TABLE(Data)
SELECT 'Hello' UNION
SELECT 'World' 

SET ROWCOUNT 1
DELETE FROM @TABLE
SET ROWCOUNT 0

SELECT * FROM @TABLE

Si la table n'a pas de PK, alors la commande ne sera pas garantie...

0 votes

Que se passe-t-il si j'ai un index en cluster qui n'est pas le même que mon PK ?

0 votes

Ah bien sûr, ma faute - Alors ce sera par la première ligne dans l'index clusterisé, comme cela ordonne physiquement les lignes, pas le PK. Je m'excuse pour la confusion.

0 votes

Même dans ce cas, il n'est pas garanti qu'il soit le "premier" ordonné par l'index en grappe. Le serveur SQL ne donne aucune garantie à ce sujet.

1voto

Christian Specht Points 15907

Cela a-t-il vraiment un sens ?
Il n'y a pas de "premier" enregistrement dans une base de données relationnelle, vous ne pouvez supprimer qu'un enregistrement aléatoire.

1 votes

Cela prend tout son sens lorsque vous ajoutez "order by" ; la question ne mentionne pas de ne pas utiliser "order by", mais seulement de ne pas utiliser "where" et les curseurs.

0 votes

Seulement si vous commandez par une colonne qui est unique. Si elle n'est pas unique, vous ne savez toujours pas exactement quel enregistrement vous supprimez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X