SQL

2011-03-17 8 views
12

का उपयोग किए बिना Magento सेटअप स्क्रिप्ट में एक auto_increment कॉलम जोड़ें इससे पहले मैंने पूछा कि ALTER TABLE in Magento setup script without using SQL कैसे करें। वहां, Ivan ने एक उत्कृष्ट उत्तर दिया जो अभी भी मुझे अभी भी संदर्भित करता है।SQL

हालांकि मुझे अभी तक Varien_Db_Ddl_Table::addColumn() का उपयोग करने के लिए auto_increment कॉलम निर्दिष्ट करने का तरीका नहीं पता है। मुझे लगता है कि identity नामक विकल्प के साथ इसका कुछ संबंध है लेकिन अब तक कोई भाग्य नहीं है।

क्या यह भी संभव है या यह कार्यक्षमता अपूर्ण है?

उत्तर

14

एक (, शायद उससे भी पहले कम से कम Magento 1.6 के बाद से) ऐसे ही एक autoincrement स्तंभ बना सकते हैं:

/** @var $table Varien_Db_Ddl_Table */ 
$table->addColumn('id', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array(
    'auto_increment' => true, 
    'unsigned' => true, 
    'nullable' => false, 
    'primary' => true, 
), 'ID'); 
इसके बजाय "auto_increment" की

, एक भी कीवर्ड "पहचान" का उपयोग कर सकते हैं।

+0

इस मूल प्रश्न के बाद से वर्ष में ऑटोइनक्रिकमेंट पेश किया गया है। – clockworkgeek

+0

10000 से शुरू होने के लिए ऑटो वृद्धि को बताने का कोई तरीका? –

10

मुझे लगता है कि ऐसा कुछ है जो अभी तक लागू नहीं किया गया है।

आप addColumn के स्रोत को देखें, तो आप इसे एक identity/auto_increment विकल्प के लिए लग रहा है और आंतरिक स्तंभ प्रतिनिधित्व पर एक IDENTITY विशेषता सेट देख सकते हैं।

#File: lib/Varien/Db/Ddl/Table.php 
if (!empty($options['identity']) || !empty($options['auto_increment'])) { 
    $identity = true; 
} 

$upperName = strtoupper($name); 
$this->_columns[$upperName] = array(
    'COLUMN_NAME'  => $name, 
    'COLUMN_TYPE'  => $type, 
    'COLUMN_POSITION' => $position, 
    'DATA_TYPE'   => $type, 
    'DEFAULT'   => $default, 
    'NULLABLE'   => $nullable, 
    'LENGTH'   => $length, 
    'SCALE'    => $scale, 
    'PRECISION'   => $precision, 
    'UNSIGNED'   => $unsigned, 
    'PRIMARY'   => $primary, 
    'PRIMARY_POSITION' => $primaryPosition, 
    'IDENTITY'   => $identity 
); 

हालांकि, अगर आप कनेक्शन वस्तु

#File: lib/Varien/Db/Adapter/Pdo/Mysql.php 
public function createTable(Varien_Db_Ddl_Table $table) 
{ 
    $sqlFragment = array_merge(
     $this->_getColumnsDefinition($table), 
     $this->_getIndexesDefinition($table), 
     $this->_getForeignKeysDefinition($table) 
    ); 
    $tableOptions = $this->_getOptionsDefination($table); 

    $sql = sprintf("CREATE TABLE %s (\n%s\n) %s", 
     $this->quoteIdentifier($table->getName()), 
     implode(",\n", $sqlFragment), 
     implode(" ", $tableOptions)); 

    return $this->query($sql); 
} 

पर createTable विधि को देखो आप देख सकते हैं _getColumnsDefinition, _getIndexesDefinition, और _getForeignKeysDefinition एक CREATE SQL टुकड़ा बनाने के लिए इस्तेमाल कर रहे हैं। इनमें से कोई भी विधि identity या auto_increment का कोई संदर्भ नहीं देती है, न ही वे किसी भी एसक्यूएल उत्पन्न करने के लिए प्रतीत होते हैं जो ऑटो वृद्धि उत्पन्न करेगा।

इस वर्ग में ही संभव उम्मीदवारों

/** 
* Autoincrement for bind value 
* 
* @var int 
*/ 
protected $_bindIncrement  = 0; 

जो एक पीडीओ बाध्य पैरामीटर (auto_increment के साथ कुछ नहीं) के लिए वेतन वृद्धि संख्या को नियंत्रित करने के लिए इस्तेमाल किया जाता है।

वहाँ भी

protected function _getOptionsDefination(Varien_Db_Ddl_Table $table) 
{ 
    $definition = array(); 
    $tableProps = array(
     'type'    => 'ENGINE=%s', 
     'checksum'   => 'CHECKSUM=%d', 
     'auto_increment' => 'AUTO_INCREMENT=%d', 
     'avg_row_length' => 'AVG_ROW_LENGTH=%d', 
     'comment'   => 'COMMENT=\'%s\'', 
     'max_rows'   => 'MAX_ROWS=%d', 
     'min_rows'   => 'MIN_ROWS=%d', 
     'delay_key_write' => 'DELAY_KEY_WRITE=%d', 
     'row_format'  => 'row_format=%s', 
     'charset'   => 'charset=%s', 
     'collate'   => 'COLLATE=%s' 
    ); 
    foreach ($tableProps as $key => $mask) { 
     $v = $table->getOption($key); 
     if (!is_null($v)) { 
      $definition[] = sprintf($mask, $v); 
     } 
    } 

    return $definition; 
} 

यहाँ auto_increment का उल्लेख है, लेकिन इस विकल्प तालिका पर सेट पर कार्रवाई करने के लिए किया जाता है। यह auto_increment तालिका AUTO_INCREMENT विकल्प को नियंत्रित करता है, जिसका उपयोग यह नियंत्रित करने के लिए किया जा सकता है कि AUTO_INCREMENT कौन सा पूर्णांक प्रारंभ होता है।