我有一个查询,我尝试插入一条记录并准备更新以防记录存在。
问题是我想知道,一旦执行查询,该操作是更新还是插入。
任何想法?
对于“并发插入”,MySQL参考手册有如下解释:
MyISAM 存储引擎支持并发插入,以减少给定表的读写器之间的争用:如果 MyISAM 表在数据文件中没有空洞(中间删除了行),则可以执行 INSERT 语句将行添加到最后SELECT 语句从表中读取行的同时。
http://dev.mysql.com/doc/refman/5.5/en/concurrent-inserts.html
假设我们的数据库“并发插入”参数设置为“自动”(1)。
我们有一个有间隙的 MyISAM 表。当我们插入新行并填补这些空白时,表是否“立即”准备好接受未来插入查询的“并发插入”?
或者我们是否需要在表知道没有间隙之前运行“优化”?
我试图用调用者的主机/IP 填充表中的某个列。我在表上有一个插入触发器,它像这样设置列:
CREATE TRIGGER access_insert_trg BEFORE INSERT ON access
FOR EACH ROW
set NEW.hostname = (select SUBSTRING_INDEX(host,':',1)
from information_schema.processlist
WHERE ID=connection_id())
;
Run Code Online (Sandbox Code Playgroud)
%尽管当我在processlist表上手动运行相同的查询时,我得到了实际的主机名,但我最终还是得到了主机名。我已经检查了该connection_id()值,它是在主机列中processlist具有实际hostname:port值的行的 id 正确。
我无法弄清楚它是如何或为什么被转换为通用%:<port>值的。关于发生了什么以及如何解决它的任何想法?
如果有任何改变,我正在使用 MySQL 5.1.57。
我厌倦了直接从 phpMyAdmin 执行插入,如下所示:
INSERT INTO oracle.PLAYLIST_MUSIC ( TID,
ID,
STATUS,
CREATED_BY,
CREATED_DATE,
UPDATED_BY,
UPDATED_DATE,
ORDER
)
VALUES(TID = 56919,
ID = 115948,
STATUS = '1',
CREATED_BY = 15217,
CREATED_DATE = NOW(),
UPDATED_BY = 15217,
UPDATED_DATE = NOW(),
ORDER = 0)
Run Code Online (Sandbox Code Playgroud)
SQL 成功执行,但是我发现所有插入的值都变成了 NULL,包括系统生成的值,如NOW().
有人有想法吗?
在一个表中,许多行已被删除,如何获取下一个缺失行的 id INSERT?
例如
id col1
1 1
3 3
4 4
5 5
8 8
9 9
Run Code Online (Sandbox Code Playgroud)
我怎样才能获得 next 的第一个可用 id 的值INSERT。在这里,我想获取id = 2.
就像是
SELECT id+1 FROM table WHERE CLAUSE // pointing to the least available value
// or x = id +1 (after SELECT)
INSERT INTO table (id, ....) VALUES ('x', ....)
Run Code Online (Sandbox Code Playgroud) 我正在开发一个带有两个参数的用户定义函数:
create or replace function gesio(
events_table_in regclass,
events_table_out regclass)
returns void as $$ ... $$
Run Code Online (Sandbox Code Playgroud)
events_table_in并events_table_out具有完全相同的架构。
简单解释一下,我遍历 的记录events_table_in,操作记录并希望以events_table_out以下方式追加(插入)操作的记录:
OPEN recCurs FOR execute
format('SELECT * FROM %s order by session_id, event_time', event_table_in);
LOOP
FETCH recCurs into rec;
if not found then
exit;
end if;
-- 1. do something with rec
-- 2. insert the rec into events_table_out
end loop;
Run Code Online (Sandbox Code Playgroud)
我怎样才能保存rec到events_table_out?
我编写了一个程序,可以INSERT批量处理 100,000 次并显示其进度。
源表包含 2.5GB 的数据:
CREATE TABLE wikt.text (
old_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
old_text MEDIUMBLOB NOT NULL,
old_flags TINYBLOB NOT NULL,
PRIMARY KEY (old_id),
KEY old_id (old_id)
) ENGINE=INNODB
AUTO_INCREMENT=23565544
DEFAULT CHARSET=binary;
CREATE INDEX old_id ON text (old_id);
Run Code Online (Sandbox Code Playgroud)
这是目标表:
CREATE TABLE domains.dictionary_language (
text_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
english TINYINT(1) UNSIGNED NOT NULL,
PRIMARY KEY (text_id),
KEY english (english)
) ENGINE=INNODB
AUTO_INCREMENT=23565544;
Run Code Online (Sandbox Code Playgroud)
这是以 100k 为批次运行的查询:
INSERT INTO domains.dictionary_language
SELECT old_id,
IF(old_text LIKE …Run Code Online (Sandbox Code Playgroud) 假设我有两个表,表 A 和表 B。表 A 有一个插入触发器,可将记录插入表 B。表 B 有一个插入触发器,可将记录插入表 A。在这种情况下会发生什么?这两个触发器是否会一遍又一遍地将记录插入表中,直到数据库填满?这种情况发生的次数有限制吗?
我有一个要求,我必须插入很多行。对于插入,我们像这样使用
insert into emp(name,age) values('abc',12);
Run Code Online (Sandbox Code Playgroud)
这将只插入一行。对于插入多行,我们可以多次编写插入查询或编写具有多个值的单个查询。例如
条件 1
insert into emp(name,age) values('abc1',121);
insert into emp(name,age) values('abc2',122);
insert into emp(name,age) values('abc3',12);
Run Code Online (Sandbox Code Playgroud)
条件2
insert into emp(name,age) values('abc',12),('abc2',122),('abc3',12);
Run Code Online (Sandbox Code Playgroud)
我的问题是上面的(条件 1 和条件 2)都需要时间吗?我猜条件 2 比条件 2 花费的时间少。如果我的猜测是真的,那么原因是什么?
我有三个表,代表两个实体和一个连接关系。每个实体关系都有一个人工代理键,用于代替自然键的外键约束。
CREATE TABLE Person (
person_id SERIAL PRIMARY KEY,
username VARCHAR NOT NULL UNIQUE
);
CREATE TABLE Group (
group_id SERIAL PRIMARY KEY,
group_name VARCHAR NOT NULL UNIQUE
);
CREATE TABLE GroupMember (
person_id INTEGER REFERENCES Person,
group_id INTEGER REFERENCES Group,
PRIMARY KEY (person_id, group_id)
);
Run Code Online (Sandbox Code Playgroud)
我想在关系中插入多个条目GroupMember,但使用关联实体的自然键。类似的东西:
INSERT INTO GroupMember (person_id,group_id)
SELECT person_id,group_id
FROM Person P, Group G, (
('alice','girls'),
('bob','boys'),
('alice','coolkids'),
('bob','coolkids')
) AS X
WHERE P.username = X.1 AND G.group_name = X.2;
Run Code Online (Sandbox Code Playgroud)
显然,上述语法无效,但希望能传达这个想法。有没有办法在 PostgreSQL 中做到这一点?
insert ×10
mysql ×6
performance ×2
postgresql ×2
sql-server ×2
t-sql ×2
trigger ×2
functions ×1
join ×1
myisam ×1
plpgsql ×1
record ×1
select ×1
update ×1