Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Return rows in the exact order they were inserted

Tags:

sql

sql-server

I have a simple join table with two id columns in SQL Server. Is there any way to select all rows in the exact order they were inserted?

If I try to make a SELECT *, even if I don't specify an ORDER BY clause, the rows are not being returned in the order they were inserted, but ordered by the first key column.

I know it's a weird question, but this table is very big and I need to check exactly when a strange behavior has begun, and unfortunately I don't have a timestamp column in my table.

UPDATE #1

I'll try to explain why I'm saying that the rows are not returned in 'natural' order when I SELECT * FROM table without an ORDER BY clause.

My table was something like this:

id1     id2
---------------
  1       1
  2       2
  3       3
  4       4
  5       5
  5       6

... and so on, with about 90.000+ rows

Now, I don't know why (probably a software bug inserted these rows), but my table have 4.5 million rows and looks like this:

id1     id2
---------------
1       1
1       35986
1       44775
1       60816
1       62998
1       67514
1       67517
1       67701
1       67837
...
1       75657 (100+ "strange" rows)

2       2
2       35986
2       44775
2       60816
2       62998
2       67514
2       67517
2       67701
2       67837
...
2       75657 (100+ "strange" rows)

Crazy, my table have now millions of rows. I have to take a look when this happened (when the rows where inserted) because I have to delete them, but I can't just delete using *WHERE id2 IN (strange_ids)* because there are "right" id1 columns that belongs to these id2 columns, and I can't delete them, so I'm trying to see when exactly these rows were inserted to delete them.

When I SELECT * FROM table, it returns me ordered by id1, like the above table, and the rows were not inserted in this order in my table. I think my table is not corrupted because is the second time that this strange behavior happens the same way, but now I have so many rows that I can delete manually like it was on 1st time. Why the rows are not being returned in the order they were inserted? These "strange rows" were definetely inserted yesterday and should be returned near the end of my table if I do a SELECT * without an ORDER BY, isn't it?

like image 267
stefanobaldo Avatar asked Jun 27 '13 14:06

stefanobaldo


2 Answers

A select query with no order by does not retrieve the rows in any particular order. You have to have an order by to get an order.

SQL Server does not have any default method for retrieving by insert order. You can do it, if you have the information in the row. The best way is a primary key identity column:

TableId int identity(1, 1) not null primary key

Such a column is incremented as each row is inserted.

You can also have a CreatedAt column:

CreatedAt datetime default getdate()

However, this could have duplicates for simultaneous inserts.

The key point, though, is that a select with no order by clause returns an unordered set of rows.

like image 90
Gordon Linoff Avatar answered Oct 12 '22 10:10

Gordon Linoff


As others have already written, you will not be able to get the rows out of the link table in the order they were inserted.

If there is some sort of internal ordering of the rows in one or both of the tables that this link table is joining, then you can use that to try to figure out when the link table rows have been created. Basically, they cannot have been created BEFORE both of the rows containing the PK:s have been created.

But on the other hand you will not be able to find out how long after they have been created.

If you have decent backups, you could try to restore one or a few backups of varying age and then try to see if those backups also contains this strange behaviour. It could give you at least some clue about when the strangeness has started.

But the bottom line is that using just a select, there is now way to get the row out of a table like this in the order they were inserted.

like image 42
user1429080 Avatar answered Oct 12 '22 10:10

user1429080