我开始使用谷歌搜索,发现这篇文章讨论了互斥表.
我有一张约有1400万条记录的表格.如果我想以相同的格式添加更多数据,有没有办法确保我想要插入的记录不存在而不使用一对查询(即,一个查询要检查,一个要插入是结果集是空)?
unique
对某个字段的约束是否保证insert
如果它已经存在则会失败?
似乎只有一个约束,当我通过php发出插入时,脚本呱呱叫.
我在MySQL上运行此查询
SELECT ID FROM (
SELECT ID, msisdn
FROM (
SELECT * FROM TT2
)
);
Run Code Online (Sandbox Code Playgroud)
并且它给出了这个错误:
每个派生表都必须有自己的别名.
是什么导致了这个错误?
我想在我的表中插入数据,但只插入我的数据库中不存在的数据!
这是我的代码:
ALTER PROCEDURE [dbo].[EmailsRecebidosInsert]
(@_DE nvarchar(50),
@_ASSUNTO nvarchar(50),
@_DATA nvarchar(30) )
AS
BEGIN
INSERT INTO EmailsRecebidos (De, Assunto, Data)
VALUES (@_DE, @_ASSUNTO, @_DATA)
WHERE NOT EXISTS ( SELECT * FROM EmailsRecebidos
WHERE De = @_DE
AND Assunto = @_ASSUNTO
AND Data = @_DATA);
END
Run Code Online (Sandbox Code Playgroud)
错误是:
消息156,级别15,状态1,过程EmailsRecebidosInsert,第11行
关键字'WHERE'附近的语法不正确.
这是我正在使用的激烈设置的粗略过度简化.table_1
并且table_2
两者都有自动增加代理主键作为ID.info
是一个包含有关table_1
和的信息的表table_2
.
table_1 (id, field)
table_2 (id, field, field)
info ( ???, field)
Run Code Online (Sandbox Code Playgroud)
我试图决定,如果我应该做的主键info
的ID从复合材料table_1
和table_2
.如果我这样做,哪一个最有意义呢?
(在这个例子中,我将ID 11209与ID 437相结合)
INT(9)
11209437 (我可以想象为什么这很糟糕)
VARCHAR (10)
11209-437
DECIMAL (10,4)
11209.437
或者是其他东西?
将它用作MYSQL MYISAM数据库的主键可以吗?
mysql myisam primary-key composite-key composite-primary-key
这个问题需要一些假设的背景.让我们考虑一个employee
有列的表name
,date_of_birth
,title
,salary
使用MySQL作为RDBMS.因为如果任何一个人的姓名和出生日期与另一个人相同,那么根据定义,他们是同一个人(除非我们有两个人在1809年2月12日出生的亚伯拉罕·林肯出生的惊人巧合),我们将把独特的按键name
和date_of_birth
,意思是"不存储同一个人两次." 现在考虑这些数据:
id name date_of_birth title salary
1 John Smith 1960-10-02 President 500,000
2 Jane Doe 1982-05-05 Accountant 80,000
3 Jim Johnson NULL Office Manager 40,000
4 Tim Smith 1899-04-11 Janitor 95,000
Run Code Online (Sandbox Code Playgroud)
如果我现在尝试运行以下语句,它应该会失败:
INSERT INTO employee (name, date_of_birth, title, salary)
VALUES ('Tim Smith', '1899-04-11', 'Janitor', '95,000')
Run Code Online (Sandbox Code Playgroud)
如果我尝试这个,它会成功:
INSERT INTO employee (name, title, salary)
VALUES ('Jim Johnson', 'Office Manager', '40,000')
Run Code Online (Sandbox Code Playgroud)
现在我的数据将如下所示:
id name date_of_birth title salary
1 …
Run Code Online (Sandbox Code Playgroud) 我的数据库有一个名为fruit
:
fruit
+-------------+
| id | name |
+ ----------- +
| 1 | apple |
| 2 | orange |
| 3 | banana |
| 4 | grape |
+-------------+
Run Code Online (Sandbox Code Playgroud)
id
是主键.我想在表中添加条目,但前提是它们不存在.
IF NOT EXISTS (SELECT name FROM fruit WHERE name = 'mango')
INSERT INTO fruit (name)
VALUES ('mango')
Run Code Online (Sandbox Code Playgroud)
我使用一个名为Sequel Pro的SQL GUI应用程序,此查询错误如下:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for …
你如何在MySQL中阻止竞争条件?手头的问题是由一个简单的算法引起的:
然后要么获得重复的行,要么通过唯一/主键阻止它,这是一个错误.
现在通常我认为事务在这里有帮助,但因为行不存在,事务实际上没有帮助(或者我错过了什么?).
LOCK TABLE听起来有点过分,特别是如果表每秒更新多次.
我能想到的唯一其他解决方案是GET_LOCK()用于每个不同的id,但是没有更好的方法吗?这里也没有可扩展性问题吗?而且,为每个表执行此操作听起来有点不自然,因为它听起来像是高并发数据库中一个非常常见的问题.
我想要一个解决方案来插入一个记录,如果它不存在所以我在这里搜索并找到了解决方案,但我有另一个问题
INSERT INTO closed_answers (question_id, subject_id)
SELECT * FROM (SELECT 2, 2) AS tmp
WHERE NOT EXISTS (
SELECT question_id FROM closed_answers WHERE question_id = 2 AND subject_id = 2
) LIMIT 1
Run Code Online (Sandbox Code Playgroud)
输出是
#1060 - Duplicate column name '2'
Run Code Online (Sandbox Code Playgroud)
如果我使用任何不相同的2个数字它将起作用,但当2个数字相同时出现问题
我需要一项服务来从Amazon S3下载excel文件,然后使用node-xlsx进行解析
问题是我无法让xlsx解析文件。当我尝试回读刚写的文件时,代码中找不到该文件。
我不确定这是否是最好的方法,但这是我到目前为止得到的:
router.get('/process', (req, res) => {
var fileName = 'https://some-bucket.s3.amazonaws.com/some-excel-file.xlsx'
https.get(fileName, response => {
var body = ''
response.on('data', chunk => body += chunk)
response.on('end', () => {
//fs is being imported early on this file
fs.writeFile(__dirname + '/test.xlsx', body)
var f = fs.createReadStream(__dirname + '/test.xlsx')
var book = xlsx.parse(f)
book.forEach(sheet => console.log('sheet', sheet.name) )
res.status(200)
})
.on('error', e => {
res.status(500)
})
})
return
})
Run Code Online (Sandbox Code Playgroud) 在 Liquibase 中,如果尚未设置值,我想插入值。对于普通插入,我怀疑如果该值已经存在,则插入的值将覆盖先前的值。如果它不存在,我希望它插入任何内容。这能做到吗?
现在我正在使用插入,如下所示:
<insert tableName="state">
<column name="name" value="fooFoo"/>
<column name="enabled" valueBoolean="true"/>
</insert>
Run Code Online (Sandbox Code Playgroud) mysql ×7
sql ×4
insert ×2
primary-key ×2
activerecord ×1
database ×1
excel ×1
express ×1
java ×1
liquibase ×1
locking ×1
myisam ×1
node.js ×1
null ×1
performance ×1
php ×1
sql-server ×1
subquery ×1
transactions ×1
xml ×1