我有下表:
mysql> SELECT * FROM `bright_promotion_earnings`;
+----+----------+------------+----------+-------+
| id | promoter | generation | turnover | payed |
+----+----------+------------+----------+-------+
| 1 | 4 | 1 | 10 | 0 |
| 3 | 4 | 5 | 100 | 0 |
| 4 | 4 | 3 | 10000 | 1 |
| 5 | 4 | 3 | 200 | 0 |
+----+----------+------------+----------+-------+
4 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
有一个独特的密钥(发起人,代,付费):
+---------------------------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index …Run Code Online (Sandbox Code Playgroud) 我已经查看了SQL Merge语句的各种示例..所有这些都看起来很棒,虽然由于某些原因我似乎无法从我的Merge测试中获得正确/预期的结果.
快速概述: 我有一个包含一些设计数据的简单表格.阅读MERGE似乎指向一种更有效的方法来进行 'upsert'(即:根据记录是否存在,插入或更新).
所以SQL 2008代码就是这样的(对不起,如果它还没有完全完成,因为我正在处理它!):
这将是一个存储过程,所以@values显然是传递的参数..
merge designs as ds
using ( select designname, designcode from designs) as dsi
on (@passedDesignName = dsi.designname and @passedDesignCode = dsi.designcode)
when matched then
update set ds.designname = @passedDesignName, ds.designcode = @passedDesignCode
when not matched then
insert (designname, designcode)
values (@passedDesignName, @passedDesignCode)
Run Code Online (Sandbox Code Playgroud)
这个问题似乎超出了我正在测试的7条记录中,所有这些记录似乎都在更新,显然我只能看到一条与更新相匹配的记录..而奇怪的是,如果我传递一些新数据(designname)和设计代码),我似乎得到一个重复插入...从我上次的测试看起来似乎有7个新的插入,我猜不只是一个侥幸..
希望我已经正确解释了这一点.攻击新事物的一部分主要是让上下文正确吗?
提前感谢您的任何反馈.
PS:对不起,合并声明结尾有一个分号!完成解析检查/语法.
我想更新 mysql 数据库, where directory = 0,然后将5 of records哪个值更新0为art.
解释:
id | directory
1 | fashion
2 | 0 //update here into 'art'
3 | travel
4 | fashion
5 | 0 //update here into 'art'
6 | 0 //update here into 'art'
7 | travel
8 | 0 //update here into 'art'
9 | 0 //update here into 'art'
10 | 0 //this is 6th record, do not update, leave the value …Run Code Online (Sandbox Code Playgroud) 我有一张表格employees,其中包含公司员工的详细信息.
每个人都分配了一个唯一的序列号.每当我们添加新员工时,它应该在添加表单时显示序列号,该序列号比最后输入的员工的序列号大一个数字.
例如,该数据库包含12名员工.最后一个条目的序列号是12.当我尝试添加新员工时,它应自动分配序列号13.所以我不需要输入序列号.我怎样才能做到这一点?
在我正在构建的应用程序中,我在重复键更新时使用了大量插入.我的问题是,在我的应用程序中,我需要知道它是插入还是更新,以便我的代码可以做出适当的决定.有谁知道我怎么测试这个?
我正在使用perl的DBI模块,如果有人知道特定的方式.谢谢!
在MySQL中,我有一个这样的tblProjects -
Project_ID Field_ID Record_ID Label 556895 1 1 Office desk 1 556895 1 2 Office desk 2 556895 2 1 This is a desk 1 556895 2 2 This is a desk 2 472246 1 1 Hello 1 472246 1 2 Hello 2 472246 2 1 This is a wooden desk 1 472246 2 2 This is a wooden desk 2
我使用sql查询(用PHP编写),它将插入一个这样的值 -
$sql_query = "INSERT INTO Items (Project_ID, Field_ID, Record_ID, Label) VALUES ('232323', '3', '3', 'New Label')";
Run Code Online (Sandbox Code Playgroud)
它工作正常.但是如果所有三个'Project_ID','Field_ID'和'Record_ID'相同,我需要更新'Label',如果任何一个不同,我需要插入新记录. …
我有一种情况,我需要用前一行值更新记录。
来源:
|MatId | BaseId |Flag|Pkg1| CS1
--------------------------------
|3001 | 3001 | 1 | 20 | 2 |
|3002 | 3001 | 0 | 15 | 3 |
|3003 | 3001 | 0 | 10 | 4 |
Run Code Online (Sandbox Code Playgroud)
这里 3001( MatID) 和 3001( BaseID) 是相同的所以FLAG =1,只有在下一条记录中BASEID是相同的。输出应仅PKG1是使用当前行值更新的字段。
目标或输出:
|MatId | BaseId|Flag|Pkg1|CS1
------------------------------
|3001 | 3001 | 1 | 20 | 2|
|3002 | 3001 | 0 | 20 | 3|
|3003 | 3001 …Run Code Online (Sandbox Code Playgroud) 我正在尝试将每日 CSV 加载文件加载到main表中,以便插入所有新记录并更新所有现有记录。我正在使用UPSERTSqlite 的功能来实现此目的。
这是我的 shell 脚本。
LOAD_FILE="/tmp/main.csv"
LOAD_TABLE="tbl_tmp_main"
MAIN_TABLE="tbl_main"
COLUMNS="t_id, t_col1, t_col2"
CREATE_TABLE_QUERY="DROP TABLE IF EXISTS $LOAD_TABLE; CREATE TABLE $LOAD_TABLE AS SELECT $COLUMNS FROM $MAIN_TABLE WHERE false"
LOAD_TABLE_QUERY=".separator ','\n.import '$LOAD_FILE' $LOAD_TABLE"
UPSERT_TABLE_QUERY="
INSERT INTO $MAIN_TABLE($COLUMNS) SELECT $COLUMNS FROM $LOAD_TABLE
ON CONFLICT(t_id) DO UPDATE
SET
t_col1 = excluded.t_col1,
t_col2 = excluded.t_col2
;
"
echo ""
echo "$CREATE_TABLE_QUERY" | sqlite3 mydatabase.sqlite3 # <-- This works
echo "[INFO] Temporary Table Created."
echo "$LOAD_TABLE_QUERY" | sqlite3 mydatabase.sqlite3 # <-- …Run Code Online (Sandbox Code Playgroud) 我的表结构是:
CREATE TABLE IF NOT EXISTS `users_settings_temp` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`userid` int(10) unsigned DEFAULT NULL,
`type` enum('type1','type2')
`data` text,
`date_created` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Run Code Online (Sandbox Code Playgroud)
我想要做的是:
假设我想插入一个新条目,但我不希望它重复,谷歌周围,我发现这种格式:
INSERT INTO users_settings_temp(...)
ON DUPLICATE KEY UPDATE data = '{$data}'
Run Code Online (Sandbox Code Playgroud)
我猜问题出现在我的表中,主键=> id.如何更改表格,以便我可以使用:
INSERT INTO ... ON DUPLICATE KEY UPDATE
Run Code Online (Sandbox Code Playgroud)
我可以使用user_id + type作为主键吗?如果是的话,请你告诉我该怎么做?
我有一个存储位置数据的android应用程序。SQLite数据库中有三组纬度和经度。我想获取一个位置的数据3次并将其存储到数据库中。在我的第一步中,存储位置,位置地址,纬度和经度。第二步,不改变位置和地点的纬度和经度,它将第一数据存储到下一列。
http://i.stack.imgur.com/YRaTL.jpg
您可以在上述图片网址中看到3组纬度和经度。在获得第一个纬度和经度之后,我要在“ latitudey”和“ longitudey”列中添加第二个纬度和经度,然后在“ latitudez”和“ longitudez”列中添加下一个值。我的编码几乎可以,但是在添加第二行时出现问题。第一纬度和经度没有任何错误地保存,但是在第二和第三纬度中复制了较高的值。您可以在以下给定的图中看到它。我该如何解决?我的数据库创建代码如下。我需要在这里做些什么改变?
public static final String DATABASE_NAME = "locationdb.db";
public static final String TABLE_NAME = "locations";
public static final String CCOLUMN_ID = "id";
public static final String COLUMN_LAT = "latitude";
public static final String CCOLUMN_LON = "longitude";
public static final String COLUMN_LAT2="latitudey";
public static final String COLUMN_LON2="longitudey";
public static final String COLUMN_LAT3="latitudez";
public static final String COLUMN_LON3="longitudez";
public static final String COLUMN_LOC = "location";
public static final String COLUMN_PLACE="place";
private HashMap hp;
public SQLiteController(Context context) …Run Code Online (Sandbox Code Playgroud) insert-update ×10
mysql ×5
php ×3
sql ×2
sqlite ×2
android ×1
database ×1
dbi ×1
java ×1
perl ×1
primary-key ×1
select ×1
sql-server ×1
t-sql ×1
upsert ×1