我有一个复选框列表,这些复选框被分配了值 1 或 0,所有这些都在 $_POST 变量中传递。
我当前的 sql 语句正确插入了所有这些内容,但是当我更改值并再次运行 sql 语句时,它会更新所有项目的“updated_at”列。
有没有办法只更新更改的值,这样就不会更新每个条目的“updated_at”列?id 是我的主键,site_id 是唯一的。
SQL语句:
$sql = "INSERT INTO admin_sites2 (site_id,created_at,active)
VALUES ('$key',now(),'$value')
ON DUPLICATE KEY
UPDATE active = $value,
updated_at = now()
";
Run Code Online (Sandbox Code Playgroud) 我需要一个查询来更新表中的一行,但如果 id 不存在,它会插入默认值。它还必须避免线程竞争条件。
我在这里找到了一个应该没问题的答案 /sf/answers/554957021/
使用此查询:
UPDATE tbl x
SET tbl_id = 24
, name = 'New Gal'
FROM (SELECT tbl_id, name FROM tbl WHERE tbl_id = 4 FOR UPDATE) y
WHERE x.tbl_id = y.tbl_id
RETURNING y.tbl_id AS old_id, y.name AS old_name, x.tbl_id, x.name;
Run Code Online (Sandbox Code Playgroud)
所以我认为它应该在更新后返回旧值,并且应该防止线程竞争条件。
但是,如果该行不存在,我需要添加一个插入,并且这次还返回插入的值(旧值没有意义,因为它们不存在)。
所以基本上我需要做类似的事情
INSERT INTO tbl
(...) VALUES (...)
RETURNING ..., ...
ON CONFLICT DO
UPDATE tbl x
SET tbl_id = 24
, name = 'New Gal'
FROM (SELECT tbl_id, name FROM tbl WHERE tbl_id = …Run Code Online (Sandbox Code Playgroud) sql postgresql insert-update race-condition select-for-update
我想更新表中可能存在或可能不存在的记录.如果它不在数据库中,那么它将被插入.
为了防止选择我UPDATE首先使用语句并检查affected_rows > 0是否,然后我将此记录插入表中.
我想知道是否有更好的方法来做到这一点?
每一个人
我需要在现有表中添加一列,以便如何通过obj c在sqlite数据库中更改表,我使用以下代码以相同的方式将数据插入表中如何编写updata表方法
- (void) InsertRecord {
if(addStmt == nil) {
const char *sql = "insert into tbl_Users(FirstName,MiddleName) Values(?,?)";
if(sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) != SQLITE_OK)
NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));
}
sqlite3_bind_text(addStmt, 1, [strFirstName UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(addStmt, 2, [strMiddleName UTF8String], -1, SQLITE_TRANSIENT);
//sqlite3_bind_text(addStmt, 3, [strLogin UTF8String], -3, SQLITE_TRANSIENT);
if(SQLITE_DONE != sqlite3_step(addStmt))
NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));
else
//SQLite provides a method to get the last primary key inserted by using sqlite3_last_insert_rowid
//productID = …Run Code Online (Sandbox Code Playgroud) 我正在尝试为我的Rails应用程序设置Beta Invites.我有一个邀请模型和一个用户模型.
用户有一个invitation_id.我正在验证用户必须有一个invitation_id,它应该是唯一的.我想编写一个迁移,以便我可以更新现有用户以获得invitation_id.
这是我的邀请模型:
# Table name: invitations
#
# id :integer not null, primary key
# sender_id :integer
# recipient_email :string(255)
# token :string(255)
# sent_at :datetime
# created_at :datetime
# updated_at :datetime
Run Code Online (Sandbox Code Playgroud)
为了保证唯一性,我将不得不在邀请表中创建记录,并将相应的ID分配给用户记录.
有人可以建议迁移吗?
提前致谢!
在SQL Server 2005中,我使用存储过程将一行插入表中,我想在插入该行后立即获取新的主键值.我使用以下方法来获取插入行后的主键值
Create Proc Sp_Test
@testEmail varchar(20)=null,-- Should be Unique
@testName varchar(20)=null -- Should be Unique
as
begin
insert into tableTest (testUserEmail,testUserName)values (@testValue,@testName)
select MAX(ID) from tableTest --ID is Primary Key
Run Code Online (Sandbox Code Playgroud)
- 要么
select ID from tableTest where testUserEmail =@testValue and testUserName = @testName
Run Code Online (Sandbox Code Playgroud)
- 要么
select SCOPE_IDENTITY() as ID
end
Run Code Online (Sandbox Code Playgroud)
请建议我哪种方法更好地执行所描述的任务.
我有一个基本的Yii CActiveForm,我用它来收集用户的输入,然后通过默认的Yii ActiveRecord模型[/ edit]插入数据库[edit].像任何人一样,我想确保聪明的用户不会通过其中一个字段删除我的数据库.
问题是:Yii CActiveForm能否在恶意做任何事情之前自动清理输入?我找不到任何关于此的文件.不确定我是否需要花时间或它已经处理好了.
谢谢!
我使用这段php插入/更新mysql db。请在相应行的注释部分中查看我的问题。谢谢。
//Connecting to your database
mysql_connect($hostname, $username, $password) OR DIE ("Unable to connect to database! Please try again later.");
mysql_select_db($dbname);
arr = array();
if (strcasecmp($actionIn, 'insert') == 0) {
$query = "INSERT INTO $usertable (id, fname, lname) VALUES ('$id', '$fname', 'lname'";
$result = mysql_query($query) or die(mysql_error()); //AT THIS STEP, I would get error message if I insert a duplicated id into table, no following json_encode would not print out, that's what I want.
if ($result) {
$arr['inserted'] = 'true'; …Run Code Online (Sandbox Code Playgroud) 在postgresql 9.5中,如何使用INSERT ... ON CONFLICT(id)DO UPDATE ...语法与序列ID一起使用?
在tbltest包含以下列的表中:
数据库中哪个tbltest_ID序列执行自动递增.
以下适用于更新,例如; 更新ID为4的记录:
INSERT INTO tbltest (
tbltest_ID,
tbltest_Name,
tbltest_Description)
VALUES
(4, 'test name','test description')
ON CONFLICT (tbltest_ID) DO UPDATE SET (
tbltest_Name,
tbltest_Description) = (
excluded.tbltest_Name,
excluded.tbltest_Description) RETURNING *;
Run Code Online (Sandbox Code Playgroud)
但是为了让DB为插入创建序列ID,我需要从语句中删除ID列:
INSERT INTO tbltest (
tbltest_Name,
tbltest_Description)
VALUES
('test name','test description')
ON CONFLICT (tbltest_ID) DO UPDATE SET (
tbltest_Name,
tbltest_Description) = (
excluded.tbltest_Name,
excluded.tbltest_Description) RETURNING *;
Run Code Online (Sandbox Code Playgroud)
如果我想更新一些新记录和一些现有记录,这就成了一个问题.好像我删除了ID列,它们都是插入的,如果我把它留在那里,我必须在VALUES数组中为每一行提供一个ID值,当我定义一个ID时,序列(db的自动增量) )不再使用.
如何INSFT ... ON CONFLICT(id)DO UPDATE ...语句spost与序列ID一起使用以插入/更新将包含新记录和现有记录的一组记录?
例如,以下内容不起作用: …
标题基本上都说明了一切.
我主要对更新案例感兴趣.假设我们正在尝试更新具有时间戳字段的记录,并且我们希望将该字段设置为更新记录的时间戳.有没有办法做到这一点?
insert-update ×10
sql ×3
mysql ×2
php ×2
postgresql ×2
sql-update ×2
database ×1
iphone ×1
knex.js ×1
migration ×1
objective-c ×1
primary-key ×1
sanitization ×1
sqlite ×1
timestamp ×1
yii ×1