我有一張表,鏈接2個其他表在一起。MySQL插入如果不存在其他刪除行
我有一個複選框列表,其中當選中一個複選框時,它通過ajax將值發送到服務器。
我想要做的是如果值是不是在數據庫中,將它們插入(檢查),或者如果他們在那裏,刪除它們(選中)
有沒有辦法做到這一點,而無需編寫幾個查詢?我知道它不難以插入/更新,但刪除呢?
我有一張表,鏈接2個其他表在一起。MySQL插入如果不存在其他刪除行
我有一個複選框列表,其中當選中一個複選框時,它通過ajax將值發送到服務器。
我想要做的是如果值是不是在數據庫中,將它們插入(檢查),或者如果他們在那裏,刪除它們(選中)
有沒有辦法做到這一點,而無需編寫幾個查詢?我知道它不難以插入/更新,但刪除呢?
INSERT IF NOT EXISTS ...在MySQL中不可用(它特定於T-SQL afaik)。請使用事務,但請記住,並非每個MySQL引擎都支持事務,但在使用事務語句時不會引發錯誤。
這可能會幫助您根據您的按鍵結構http://bogdan.org.ua/2007/10/18/mysql-insert-if-not-exists-syntax.html
否則你可能能夠處理你和一個子查詢做什麼的?
不是100%,你所尋找的,但它確實插入,如果不存在: http://remy.supertext.ch/2010/11/mysqlupdate-and-insert-if-not-exists/
INSERT INTO wp_postmeta (post_id, meta_key) SELECT ?id, ‘page_title’
FROM DUAL WHERE NOT EXISTS (
SELECT meta_id FROM wp_postmeta WHERE post_id = ?id AND meta_key = ‘page_title’);
UPDATE wp_postmeta SET meta_value = ?page_title WHERE post_id = ?id AND meta_key = ‘page_title’;
有作爲對重複刪除沒有這樣的事情或正確使用IF ELSE與子查詢在一個查詢中執行此操作(這將很方便,因爲這一個查詢將成功或失敗)。想想你不得不經過幾次查詢來實現你的目標,就像我一樣。但要跟蹤後續查詢是否繼續成功。
從「未知」或「NoChange」開始返回一個返回值(本例中爲'狀態')。如果這返回給你ajax調用,你知道該複選框需要在點擊之前返回到它以前的狀態,並且可能彈出一條消息(你可以攜帶json)。
在正確的if/then代碼結構中運行您的查詢,並跟蹤後續查詢,並在系列相應成功時更新'狀態'。 這應該完全符合你的需求,避免出現黑洞。
(我用一些包裝用於運行查詢,返回真/假/空/ errorinformation - 這允許你檢查每個查詢結果)
我假設你有你的Ajax調用已經到位。該代碼示例從哪裏開始你的Ajax調用從服務器端開始處理:
ob_end_clean();
$json = array("state" => "Unknown");
$module_id = (isset($_POST['module_id']) ? $_POST['module_id'] : null);
$group_id = (isset($_POST['group_id']) ? $_POST['group_id'] : null);
$action = (isset($_POST['action']) ? $_POST['action'] : null);
if (!empty($module_id) && !empty($group_id) && !empty($action)) {
$query = "
SELECT
1
FROM
config_module_actions_groups
WHERE
1
AND module_id = '{$module_id}'
AND group_id = '{$group_id}'
AND action = '{$action}'
";
if (getQueryAsArraySingleValues($query)) {
$query = "
DELETE FROM
config_module_actions_groups
WHERE
1
AND module_id = '{$module_id}'
AND group_id = '{$group_id}'
AND action = '{$action}'
";
if (executeQuery($query)) {
$json["state"] = "Off";
} else {
$json["message"] = "Not correctly deactivated";
}
} else {
$query = "
REPLACE INTO
config_module_actions_groups
SET
module_id = '{$module_id}',
group_id = '{$group_id}',
action = '{$action}'
";
if (executeQuery($query)) {
$json["state"] = "On";
} else {
$json["message"] = "Not correctly activated";
}
}
}
// output
echo json_encode($json);
exit;
我知道我dev'ing對服務器的操作,但我們要儘快改變主機,不知道是什麼版本或者什麼系統管理員將會或不會允許我們結束,所以我儘量保持它儘可能基本。 – guyfromfl
使用一個唯一的索引並使用插入忽略,這樣它將插入如果不存在。你可以通過這種方式來完成相同的事情。 – Adrian