code: def create_or_update_table(self,
                                 tablename: str,
                                 fieldspeclist: FIELDSPECLIST_TYPE,
                                 drop_superfluous_columns: bool = False,
                                 dynamic: bool = False,
                                 compressed: bool = False) -> None:
          
  
          # 1. Make table, if it doesn't exist
          self.make_table(tablename, fieldspeclist, dynamic=dynamic,
                          compressed=compressed)
  
          # 2. Are all the fields there?
          # ... copes fine with fieldnames coming back in Unicode and being
          #     compared to str
          fields_in_db = set(self.fetch_column_names(tablename))
          desired_fieldnames = set(
              self.fieldnames_from_fieldspeclist(fieldspeclist))
          missing_fieldnames = desired_fieldnames - fields_in_db
          missing_fieldspecs = self.fieldspec_subset_by_name(fieldspeclist,
                                                             missing_fieldnames)
          for f in missing_fieldspecs:
              self.add_column(tablename, f)
  
          # 3. Anything superfluous?
          superfluous_fieldnames = fields_in_db - desired_fieldnames
          for f in superfluous_fieldnames:
              if drop_superfluous_columns:
                  log.warning("... dropping superfluous field: " + f)
                  self.drop_column(tablename, f)
              else:
                  log.warning("... superfluous field (ignored): " + f)
  
          # 4. Make indexes, if some have been requested:
          for fs in fieldspeclist:
              self.create_index_from_fieldspec(tablename, fs)
docs: - Make table, if it doesn't exist.
          - Add fields that aren't there.
          - Warn about superfluous fields, but don't delete them, unless
            ``drop_superfluous_columns == True``.
          - Make indexes, if requested.