有时当我向数据库中的表插入一个新行时,它会出现在最后一行之前。
我会解释。如果我有下表:
ID Name 1 James 2 Terry 3. Miriam 4. Arthur
我想在“Danny”中插入一个新行,有时会发生这种情况:
ID Name 1 James 2 Terry 3. Miriam 5. Danny 4. Arthur
我的代码在99%的情况下有效,但有时只会发生。 我不知道该怎么办?这是正常的吗?
我使用ID列上的autoIncrement处理ASP.NET,VB.NET,.NET 3.5和MySQL数据库。 我已经看到它也发生在Access和SQL Server中。
这是我的代码:
' insert to user_table
Dim connString As String = ConfigurationManager.ConnectionStrings("mysql_ConnString").ConnectionString
Dim conn As MySqlConnection = New MySqlConnection(connString)
Dim sqlCommand As String
sqlCommand = "INSERT INTO user_table (Nickname,Email,Pass,SubscriptionMode,SignupDate,LastVisitDate,VisitCounter) VALUES (@Nickname,@Email,@Pass,@SubscriptionMode,@SignupDate,@LastVisitDate,@VisitCounter)"
Dim cmd As New MySqlCommand(sqlCommand, conn)
Try
conn.Open()
cmd.Parameters.AddWithValue("@Nickname", txtNickname.Text)
cmd.Parameters.AddWithValue("@Email", txtEmail.Text)
cmd.Parameters.AddWithValue("@Pass", password)
cmd.Parameters.AddWithValue("@SubscriptionMode", 1)
cmd.Parameters.AddWithValue("@SignupDate", Date.Now)
cmd.Parameters.AddWithValue("@LastVisitDate", Date.Now)
cmd.Parameters.AddWithValue("@VisitCounter", 0)
cmd.ExecuteNonQuery()
Catch ex As Exception
GlobalFunction.sendToLog(ex, "problem in create profile page - sub: insertUser_table")
GlobalFunction.jsMessage(Me, "problem in create profile page - sub: insertUser_table")
Return False
Finally
conn.Close()
End Try
答案 0 :(得分:7)
一般来说,当你这样做时
select * from Users
你不能依赖记录的顺序。如果您需要按特定顺序记录,则必须明确指定order by
子句
select * from Users order by ID
答案 1 :(得分:2)
MySql是一个关系数据库管理系统,这意味着它基于关系模型。表的行的物理顺序(表示关系)并不重要。您必须将表视为Unorder Sets。如果要按特定顺序显示数据,则必须使用order by子句。
我认为如果你使用InnoDB,你可以使用聚集索引来指定行的顺序。
答案 2 :(得分:1)
更正您的问题:我的数据库表未订购
您的数据库表 已订购,但您的select语句未已订购。
而且因为这不是你没有得到有序结果的原因
您获得的结果是 undefined 订单!
如果您想要一个有序的结果,必须始终在查询中指定order by
子句。
答案 3 :(得分:0)
将ID设为主键并将其编入索引。无论你新输入的行是最后一行。选择使用上面关于订购的建议。
答案 4 :(得分:0)
正如Bala R所说,你不能让SQL决定你想如何组织你的数据,所以你想做这样的事情:
SELECT * FROM Users ORDER BY id ASC
例如:(1,2,3,4,5)
或者这个:
SELECT * FROM Users ORDER BY id DESC
例如:(5,4,3,2,1)