插入表并根据当前最高编号递增列

时间:2017-04-07 14:58:53

标签: sql sql-server sql-server-2008

我有一个包含一堆列的表,其中一列名为[pos]。该列包含一个数字。插入新记录时,我希望能够插入新记录,但[pos]比db中已经存在的最高[pos]高1。

Insert into table(c1,c2,pos) VALUES('c1','c2',?)

我正在使用MSSQL

4 个答案:

答案 0 :(得分:1)

您只需提取Signup file <?php if(isset($_POST['signup'])) { mysql_connect("localhost","root",""); mysql_select_db("faceback"); $Email=$_POST['email']; $que1=mysql_query("select * from users where Email='$Email'"); $count1=mysql_num_rows($que1); if($count1>0) { echo "<script> alert('There is an existing account associated with this email.'); </script>"; } else { $Name=$_POST['first_name'].' '.$_POST['last_name']; $Password=$_POST['password']; $Gender=$_POST['sex']; $Birthday_Date=$_POST['day'].'-'.$_POST['month'].'-'.$_POST['year']; $FB_Join_Date=$_POST['fb_join_time']; $day=intval($_POST['day']); $month=intval($_POST['month']); $year=intval($_POST['year']); if(checkdate($month,$day,$year)) { $que2=mysql_query("insert into users(Name,Email,Password,Gender,Birthday_Date,FB_Join_Date) values('$Name','$Email',AES_ENCRYPT('$Password','897sdn9j98u98jk'), '$Gender','$Birthday_Date','$FB_Join_Date')"); session_start(); $_SESSION['tempfbuser']=$Email; } Login file <?php if(isset($_POST['Login'])) { mysql_connect("localhost","root",""); mysql_select_db("faceback"); $user=$_POST['username']; $pass=$_POST['password']; $que1=mysql_query("select Email,AES_DECRYPT(Password,'897sdn9j98u98jk') from users where Email='$user' and Password='$pass'"); $count1=mysql_num_rows($que1); if($count1>0) { session_start(); $_SESSION['tempfbuser']=$user; } 并向其添加Max(Pos)

1

答案 1 :(得分:1)

SQL Server可以为您管理。将Pos设为identity column

示例

-- Creating a identity column.
DECLARE @Table TABLE
(
    C1  VARCHAR(2),
    C2  VARCHAR(2),
    Pos INT IDENTITY (1, 1)
);

-- Populating the table.
-- NOTE: SQL Server takes care of Pos for you.
INSERT INTO @Table 
(
    C1, 
    C2
)
VALUES
    ('C1', 'C2'),
    ('C3', 'C4')
;

<强>返回

C1  C2  Pos
C1  C2  1
C3  C4  2

答案 2 :(得分:1)

嗯,单行的直接方式:

insert into table(c1,c2,pos) 
select 'c1','c2',1+isnull((select max(pos) from table),0)

对于多组值,您可以执行以下操作:

create table t (c1 char(2), c2 char(2), pos int);

insert into t (c1,c2,pos) 
select v.c1,v.c2,row_number() over (order by (select 1))+x.MaxPos
from (values ('c1','c2'),('d1','d2'),('e1','e2')) v (c1,c2)
cross join (
  select MaxPos = isnull(max(pos),0) 
  from t
  ) x;

select * from t;

rextester演示:http://rextester.com/DVJB25196

返回:

+----+----+-----+
| c1 | c2 | pos |
+----+----+-----+
| c1 | c2 |   1 |
| d1 | d2 |   2 |
| e1 | e2 |   3 |
+----+----+-----+

答案 3 :(得分:0)

有几种方法可以做到这一点。但是,我们确实需要比您提供的更多信息。具体来说,(1)表中是否有两个条目,[pos]的值相同,(2)用户是否可以指定新的[pos]值低于表中的现有值?出于这个解决方案的目的,我将假设这两个问题的答案是&#34; NO&#34;。

使用IDENTITY字段是最常见的,虽然根据您的规范,您可能需要多次重置IDENTITY的基础,这可能会造成混淆和问题。

SEQUENCE可以以类似的方式使用,您必须根据需要重置序列的基础。

如果你真的必须查看表中的最大值(如果你可以删除可能具有最高[pos]值的行,那么特别重要),那么你可能需要在[pos]列上放置一个UNIQUE约束,为每个插入或删除使用事务,并在获取最大值或删除行时使用TABLOCK和ROWLOCK提示。确保您开始事务并仅在SQL中使用ROWLOCK或TABLOCK提示读取最高[pos]值,只是立即添加新行,提交事务,并确保释放锁是唯一的方法你似乎要求的东西。