我有一个包含一堆列的表,其中一列名为[pos]。该列包含一个数字。插入新记录时,我希望能够插入新记录,但[pos]比db中已经存在的最高[pos]高1。
Insert into table(c1,c2,pos) VALUES('c1','c2',?)
我正在使用MSSQL
答案 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]值,只是立即添加新行,提交事务,并确保释放锁是唯一的方法你似乎要求的东西。