# File mysql-serialize.rb, line 92
  def sql_create (dbi)
    sql = "CREATE TABLE " + sql_quote_name(self.type.name.sub(/#<Module .*?>::/, "")) + " ("
    sql << sql_quote_name(@sql_primary_key.id2name)

    pk = self.instance_eval("@" << @sql_primary_key.id2name)
    if (pk.kind_of? String)
      # WARNING! ALERT! 
      # The string will be truncated to 255 bytes if it is primary 
      # key and we are using mysql!!!
      sql << " VARCHAR(255) "
    elsif (pk.kind_of? Integer)
      sql << " BIGINT " 
    elsif (pk.kind_of? Float)
      sql << " DOUBLE "
    elsif (pk.kind_of? Time)
      sql << " TIME "
    elsif (pk.kind_of? Date)
      sql << " DATE "
    end
    sql << "PRIMARY KEY, "

    sql_fetch_variable_names(false).each { |name|
      # we already have defined the primary key
      # and we are going to define sql_assoc_id explicitly in a moment
      next if (name == @sql_primary_key.id2name)
      next if (name == "sql_assoc_id")

      sql << sql_quote_name(name) 

      # notice that I am never trying to preserve space, always 
      # choosing the largest available data type.
      val = instance_eval("@" << name)
      if (val.kind_of? Integer)
        sql << " INT, "
      elsif (val.kind_of? Float)
        sql << " DOUBLE, "
      elsif (val.kind_of? Time)
        sql << " TIME, "
      elsif (val.kind_of? Date)
        sql << " DATE, "
      elsif (val.kind_of? String)
        sql << " LONGBLOB, "
      elsif (val.nil?)
        # this *might* not be a good idea
        sql << " LONGBLOB, "
      end
    }

    sql << sql_quote_name("sql_assoc_id") << " INT NOT NULL, "
    sql << "INDEX (" << sql_quote_name("sql_assoc_id") << "), "
    sql << "FOREIGN KEY (" << sql_quote_name("sql_assoc_id") << ") "
    sql << "REFERENCES " << sql_quote_name("sql_ids") << "("
    sql << sql_quote_name("id") << ") ON DELETE CASCADE"
    sql << ") TYPE = InnoDB"

    dbi.do_more(sql)

    [["array", "arr_index", false], ["hash", "key_id", true], ["assoc", nil, false]].each { |range_key_id_fk|
      range, key_id, fk = range_key_id_fk
      sql = "CREATE TABLE " << sql_quote_name(self.type.name.sub(/#<Module .*?>::/, "") + "_" + range) << " ("
      sql << sql_quote_name("sql_assoc_id") << " INT NOT NULL, "
      sql << sql_quote_name(key_id) << " INT NOT NULL, " unless key_id.nil? # assocs don't have keys - hence the nil above
      sql << sql_quote_name("val_id") << " INT NOT NULL, "
      sql << sql_quote_name("symbol") << " VARCHAR(255) NOT NULL, " # this means that instance variable names cannot exeed 255 chars
      sql << "INDEX (" << sql_quote_name("sql_assoc_id") << "), "
      if (fk)
        sql << "INDEX (" << sql_quote_name(key_id) << "), "
      end
      sql << "INDEX (" << sql_quote_name("val_id") << "), "
      sql << "FOREIGN KEY (" << sql_quote_name("sql_assoc_id") << ") "
      sql << "REFERENCES " << sql_quote_name("sql_ids") << "("
      sql << sql_quote_name("id") << ") ON DELETE CASCADE, "
      if (fk)
        sql << "FOREIGN KEY (" << sql_quote_name(key_id) << ") "
        sql << "REFERENCES " << sql_quote_name("sql_ids") << "("
        sql << sql_quote_name("id") << ") ON DELETE CASCADE, "
      end
      sql << "FOREIGN KEY (" << sql_quote_name("val_id") << ") "
      sql << "REFERENCES " << sql_quote_name("sql_ids") << "("
      sql << sql_quote_name("id") << ") ON DELETE CASCADE"
      sql << ") TYPE = InnoDB"
      dbi.do_more(sql)
    }
  end