我真的需要一个自动增量id列吗?

时间:2014-10-01 09:05:57

标签: mysql insert logic

我有一个带有META_ID |的表结构KEY |价值| USER_ID其中META_ID是自动递增的。现在在我的php逻辑

1获取每个用户的结果键值对

2删除每个用户的键值行

3更新或插入已知USER_ID的键值对

4为新用户插入键值对

但是META_ID不断增长,所以我想知道我是否可以删除META_ID列?

案例逻辑

注册用户或返回的注册用户如果尚未提交表格,可以随时更新表格。因此超时用户可以选择和取消选择某些表单选项并触发更新,插入或删除。 现在,“返回用户取消选择一个键(并且需要删除该行)”背后的逻辑“给我一个问题。这就是我删除所有用户键值对的原因。但是什么是正确的方式?

因此,如果键值存在于db表中但不存在于$ params中,我需要删除它!

这是我的功能

function user_shopping_meta_data($params) {
        global $wpdb;
        $shopping_meta_table = 'wp_shopping_metavalues';
        $wp_user_id = $params['wp_user_id'];
        //1 CHECK IF USER HAS KEY VALUE PAIRS
        $checkKeyValues = $wpdb->get_results("SELECT meta_shopping_key FROM $shopping_meta_table WHERE wp_user_id = '$wp_user_id'");
        //2 WE DELETE
        $qdel = $wpdb->delete($shopping_meta_table, array('wp_user_id' => $wp_user_id));
        //3 UPDATE OR INSERT
        foreach ($params as $key => $val) {
            //variables
            if (is_array($val)) {
                           $val = json_encode($val);
                       }
            $shopping_meta_values = array(
                            'wp_user_id' => $wp_user_id,
                            'meta_shopping_key' => $key,
                            'meta_shopping_value' => $val
                        );

            if (count($checkKeyValues) > 0) {//3 USER IS KNOWN SO UPDATE and/or INSERT new key-value
                foreach ($checkKeyValues as $check) {
                    //UPDATE OR INSERT
                    if (($key != "wp_user_id")) {       
                        //FOR UPDATE where
                        $shopping_meta_where = array('meta_shopping_key' => $key, 'wp_user_id' => $wp_user_id);
                        $result = $wpdb->get_results("SELECT * FROM $shopping_meta_table WHERE meta_shopping_key = '" . $key . "' AND wp_user_id = '$wp_user_id'");
                        if (count($result) > 0) {//KEY ALREADY EXISTS FOR USER
                            $return .= $wpdb->update($shopping_meta_table, array('meta_shopping_key' => $key, 'meta_shopping_value' => $val), $shopping_meta_where) . '<br/>';
                            //$return .= 'UDPATE<br/>';
                        } else {//KEY IS NEW
                            $return .= $wpdb->insert($shopping_meta_table, $shopping_meta_values) . '<br/>';
//                            $return .= 'INSERT for old';
                        }
                    }//.end $key
                }//.end foreach checkKeyValue
            }//.end count
            else {//4 INSERT KEY VALUE PAIR FOR NEW USER
                 if (($key != "wp_user_id")) {
                    $return .= $wpdb->insert($shopping_meta_table, $shopping_meta_values) . '<br/>';
//                    $return .= 'INSERT NEW';
                }
            }
        }//.end each
        echo 'Test return: ' . $return;
    }

4 个答案:

答案 0 :(得分:2)

删除它不会获得太多收益。你可能会认为你节省了一些空间,但事实上你并没有。 auto_increment列始终也是主键的一部分。如果删除它,MySQL将创建一个&#34;隐式&#34;主键,它不可见但是MySQL需要识别行。你也会因为无法使用LAST_INSERT_ID()而失去一些安慰。

答案 1 :(得分:-1)

你可以删除它。这只是一个独特的ID。如果您可以在没有META_ID的情况下区分不同的行,或者您不需要区分行,那么META_ID就是多余的。

答案 2 :(得分:-1)

如果我能给你一个建议,最好把这个领域留作历史。 如果您需要知道为该用户执行的最后一个操作是什么,您可以通过META_ID订购。 在表中使用主键很有用。但这只是一个建议

答案 3 :(得分:-1)

我建议你有一个主键,你确信它是独一无二的。为此使用自动增量列是个好主意,因为您始终确保它是唯一的。