这是我想要做的.如果主键(entity_id)存在,我想插入此表或更新记录.我只是遇到了SQL语法的问题.它不会让我有比第一个'VALUES'更多的参数,所以我得到以下错误:
参数索引超出范围(7>参数个数,即6).
int insertOrUpdateSuccess = MyDBSyncher.UPDATE("INSERT INTO " + DB_NAME + ".entities " +
"(`entity_id`, `wai_type`, `wai_id`, `character_id`, `looted`, `creation_time`) " +
"VALUES ((?), (?), (?), (?), (?), (?)) " +
"ON DUPLICATE KEY UPDATE " +
"`wai_type`='(?)', `wai_id`='(?)', `character_id`='(?)', `looted`='(?)'",
new String[]{tmpEntityId, values[0], values[1], values[2], values[3], values[4],
values[0], values[1], values[2], values[3]});
Run Code Online (Sandbox Code Playgroud)
这有点像我想的那样,但我不能解释它的需要.很抱歉可能会发布重复内容.
哦,这是我的代码中的UPDATE()函数:
public static int UPDATE(String updateStatement, String[] params){
try {
if(!conn.isClosed()) {
logger.trace("Successfully connected to MySQL server using TCP/IP - " + conn);
stat = conn.prepareStatement(updateStatement); …Run Code Online (Sandbox Code Playgroud) 我一直在阅读如何在重复键上使用 MySQL 插入,看看它是否能让我避免选择一行,检查它是否存在,然后插入或更新。然而,当我阅读文档时,有一个方面让我感到困惑。这是文档所说的:
如果您指定 ON DUPLICATE KEY UPDATE,并且插入的行会导致 UNIQUE 索引或 PRIMARY KEY 中的重复值,则执行旧行的 UPDATE
问题是,我不想知道这是否适用于我的问题,因为我不插入新的“条件”是存在两列等于某个值的行,不一定主键是一样的。现在我想象的语法是这样的,但我不知道它是否总是插入而不是替换:
INSERT INTO attendance (event_id, user_id, status) VALUES(some_event_number, some_user_id, some_status) ON DUPLICATE KEY UPDATE status=1
Run Code Online (Sandbox Code Playgroud)
问题是, event_id 和 user_id 不是主键,但是如果“出席”表中的一行已经包含具有这些值的那些列,我只想更新它。否则我想插入它。这甚至可以通过 ON DUPLICATE 实现吗?如果没有,我可以使用什么其他方法?
我有一个表格作品集,时间戳设置为自动更新.
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
Run Code Online (Sandbox Code Playgroud)
PHP中的PDO语句不会导致时间戳更新.
$statement = $this->connection->prepare("
INSERT INTO folio(publication, productId)
VALUES(:publication, :productId)
ON DUPLICATE KEY UPDATE
id=LAST_INSERT_ID(id), publication=:publication, productId=:productId");
Run Code Online (Sandbox Code Playgroud)
以下手动方法有效但不可取.
$statement = $this->connection->prepare(
"INSERT INTO folio(publication, productId)
VALUES(:publication, :productId)
ON DUPLICATE KEY UPDATE
id=LAST_INSERT_ID(id), publication=:publication, productId=:productId, timestamp=NOW()");
Run Code Online (Sandbox Code Playgroud)
更新:这是我的作品集表结构
CREATE TABLE `folio` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`publication` varchar(255) DEFAULT NULL,
`productId` varchar(255) DEFAULT NULL,
`timestamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `unique_folio` (`publication`,`productId`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)
更新2:将timestamp设置为not null后的表结构 …
我的表结构(MySQL /每个都与下面相同)
+-------+--------------+------+------+-------------------+
| Field | Type | Null | Key | Default |
+-------+--------------+------+------+-------------------+
| id | int(11) | NO | PRI | AUTO INCREMENT |
| lesson| varchar(255) | NO | | LESSON_NAME |
| exam | char(50) | NO |UNIQUE| NO DEFAULT |
| quest | text | NO | | NO DEFAULT |
| answer| text | NO | | NO DEFAULT |
| note | text | NO | | NO DEFAULT |
+-------+--------------+------+------+-------------------+
Run Code Online (Sandbox Code Playgroud)
并且我发布了一些值来通过ajax($ …
在我正在构建的应用程序中,我在重复键更新时使用了大量插入.我的问题是,在我的应用程序中,我需要知道它是插入还是更新,以便我的代码可以做出适当的决定.有谁知道我怎么测试这个?
我正在使用perl的DBI模块,如果有人知道特定的方式.谢谢!
让我们考虑一下,我有一个用于生成表B的表A.我没有可用于a的主键或唯一键ON DUPLICATE KEY.
我的表B有3列:A,B和C.
INSERT只有当行已经不存在时我才想这样做.我可以确定该行是否存在是A和B的组合.我使用一个WHERE NOT EXISTS语句来执行此操作.
INSERT INTO TableB
(A, B, C)
SELECT
SUM(A),
SUM(B),
SUM(C)
FROM TableA
WHERE NOT EXISTS (SELECT * FROM TABLE B WHERE A=A AND B=B)
GROUP BY A, B
Run Code Online (Sandbox Code Playgroud)
如果表B为空,则插入行.但是,只要表B有记录,即使表B中不存在行,也不会插入任何行.
我有一个查询(Code是PRIMARY KEY):
INSERT INTO table (Code, ... events)
VALUES
(1, ... CONCAT(events, 'BAR')),
(2, ... CONCAT(events, 'BAR')),
...
ON DUPLICATE KEY
UPDATE ... events = VALUES(events)
Run Code Online (Sandbox Code Playgroud)
我的意图是,events如果给定键已经有一行,则将插入的值连接到现有值。
对于我的查询,假设eventsis的现有值FOO,新events值总是'BAR'而不是'FOOBAR'。
实现我想要的正确方法是什么?
我试图在我的网站上记录用户的IP地址,并且我想在用户登录时拥有以下流程
if (new ip address detected)
enter in to db
else if (ip address has already been recorded)
do nothing
Run Code Online (Sandbox Code Playgroud)
这样我就不会记录每次用户登录的时间,只要它来自新的IP地址.我认为我有正确的代码,但重复仍然进入数据库.任何人都可以看到我错在哪里?
public function insertIpAddress($user_id, $user_ip) {
return $this->dbHandler->DbQuery("INSERT into user_ip (user_id, ip_address)
VALUES (?,?) ON DUPLICATE KEY UPDATE `user_id` = `user_id`",
array($user_id,$user_ip));
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过ON DUPLICATE KEY UPDATE ip_address= ip_address,但那不起作用.
我的数据库看起来像这样:
它就是这样出来的:
ip_address user_id
10.245.1.38 378
10.245.1.38 378
Run Code Online (Sandbox Code Playgroud) 我有很多行数据要插入到一个表中。表中已有数据。当我像这样进行批量插入时,
INSERT INTO permission(username, permission) values(('john','ticket_view'), ('john','ticket_modify'), ('john','ticket_approve'));
Run Code Online (Sandbox Code Playgroud)
但是我的表已经有一行john, ticket_view在这种情况下我上面的插入查询以错误结束duplicate key value violates unique constraint。
如何在 postgresql 9.3 中忽略这个重复问题?我只想插入所有行。如果存在类似的行,我想忽略它。我怎样才能做到这一点?我欢迎你的帮助。
我有这个在我的Python脚本中执行的查询,但是当它插入数据库并找到我的唯一列的副本时,它会导致错误并停止.我知道我需要使用On Duplicate Key Update,但我要注意如何正确添加它.
我独特的专栏2.
cur.execute("""INSERT INTO logs (1,2,3) VALUES (%s,%s,%s) """,(line[0], line[1], line[2]))
Run Code Online (Sandbox Code Playgroud)
如果有重复,则让它更新该行/条目.
on-duplicate-key ×10
mysql ×9
php ×3
sql ×3
dbi ×1
insert ×1
java ×1
perl ×1
postgresql ×1
python ×1
sql-insert ×1
sql-update ×1
timestamp ×1
upsert ×1